Android-NDK:未定义对';stderr';

Android-NDK:未定义对';stderr';,android,android-studio,gradle,android-ndk,Android,Android Studio,Gradle,Android Ndk,我想在Android应用程序中使用ASI SDK(预构建二进制)。我使用的是Windows10上的Android Studio 2.1.3,带有gradle“实验插件”和Android NDK r12b 调用基本SDK函数的JNI测试方法如下所示: #include <jni.h> #include <stdio.h> #include <ASICamera2.h> JNIEXPORT jstring JNICALL Java_at_wana_androgu

我想在Android应用程序中使用ASI SDK(预构建二进制)。我使用的是Windows10上的Android Studio 2.1.3,带有gradle“实验插件”和Android NDK r12b

调用基本SDK函数的JNI测试方法如下所示:

#include <jni.h>
#include <stdio.h>
#include <ASICamera2.h>

JNIEXPORT jstring JNICALL
Java_at_wana_androguide_MainActivity_getMsgFromJni(JNIEnv *env, jobject instance)
{
   char str[512];

   int numCams = ASIGetNumOfConnectedCameras();
   snprintf(str, sizeof(str), "Connected cameras: %d", numCams);

   return env->NewStringUTF(str);
}
由于ASI SDK依赖于
libusb
,因此我还将
libusb
源添加为一个单独的模块,并将其作为依赖项导入
app
模块。这是
libusb
模块(称为“usb”)的
build.gradle
文件:

问题:

这段代码构建正常,但当我在Android 5的Genymotion(x86)中运行它时,它会崩溃并出现运行时异常:

java.lang.UnsatisfiedLinkError:dlopen失败:找不到符号 由“libhello android jni.so”引用的“stderr”

我尝试将
supc++
和/或
stdc++
添加到
ldFlags
,尝试将文件扩展名更改为
cpp
并返回到
c
,并且我已经尝试在build.gradle文件中将
platformVersion
设置为19甚至9,但这只会导致编译时错误,即未定义
stderr

C:\Users\greuff\Documents\devel\AndroGuide\app\src\main\jni\drivers\ASI\lib\x86\libASICamera2.a(ASICamera2.o):ASICamera2.cpp:function ASIGetNumOfConnectedCameras:错误:未定义对“stderr”的引用 collect2.exe:错误:ld返回了1个退出状态

奇怪的是,这个错误只发生在
x86
平台目标上


我读到,
stderr
等在某个时间点从Android NDK头文件中删除,因为它们在
libc
中变成了真正的函数,但我不太确定如何解决这个问题,因为将
platformVersion
设置为较低的值(如一些问题中所建议的)没有帮助。如果能给我指出正确的方向,我将不胜感激。

结果证明我在追求错误的东西。ASI SDK是针对glibc静态编译的,glibc包含
stderr
作为全球可用的符号,而bionic(安卓libc)不包含它们

我所要做的就是取消定义
stderr
,并将其创建为链接器符号,以便链接器可以找到它:

#include <jni.h>
#include <stdio.h>
#include <ASICamera2.h>

#undef stderr
FILE *stderr = &__sF[2];

...
#包括
#包括
#包括
#未定义标准
文件*stderr=&uuu-sF[2];
...

“ASI SDK是针对glibc静态编译的”。该库是为Linux而不是Android编译的。这对你来说将是一场艰苦的战斗。
apply plugin: "com.android.model.native"

model {
    android {
        compileSdkVersion 24
        buildToolsVersion "24.0.2"

        ndk {
            moduleName "usb"

            CFlags.add("-I${file("src/main/jni")}".toString())
            CFlags.add("-I${file("src/main/jni/os")}".toString())

            ldLibs.addAll(["log"])
        }
    }
}
#include <jni.h>
#include <stdio.h>
#include <ASICamera2.h>

#undef stderr
FILE *stderr = &__sF[2];

...