Android-NDK:未定义对';stderr';
我想在Android应用程序中使用ASI SDK(预构建二进制)。我使用的是Windows10上的Android Studio 2.1.3,带有gradle“实验插件”和Android NDK r12b 调用基本SDK函数的JNI测试方法如下所示: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
#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];
...