gpt4 book ai didi

安卓NDK : undefined reference to 'stderr'

转载 作者:太空狗 更新时间:2023-10-29 15:59:50 25 4
gpt4 key购买 nike

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

调用基本 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);
}

app 模块的 build.gradle 如下所示:

apply plugin: 'com.android.model.application'

model {
android {
compileSdkVersion 24
buildToolsVersion "24.0.2"

defaultConfig {
applicationId "at.wana.androguide"
minSdkVersion.apiLevel 19
targetSdkVersion.apiLevel 24
versionCode 1
versionName "0.1"
}
buildTypes {
release {
minifyEnabled false
proguardFiles.add(file('proguard-android.txt'))
}
}
ndk {
moduleName "hello-android-jni"
abiFilters.add("arm64-v8a")
abiFilters.add("x86")
stl "gnustl_static"
}
sources {
main {
jni {
dependencies {
library "ASISDK" linkage "static"
project ":usb" linkage "shared"
}
}
}
}
}
repositories {
libs(PrebuiltLibraries) {
ASISDK {
headers.srcDir "src/main/jni/drivers/ASI/include"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("src/main/jni/drivers/ASI/lib/${targetPlatform.getName()}/libASICamera2.a")
}
}
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.2.0'
compile 'com.squareup:otto:1.3.8'
}

由于 ASI SDK 依赖于 libusb,我还添加了 libusb 源作为一个单独的模块,并将其作为依赖导入到 app 模块。这是 libusb 模块(称为“usb”)的 build.gradle 文件:

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"])
}
}
}

问题:

此代码构建正常,但当我在 Genymotion (x86)、Android 5 中运行它时,它因运行时异常而崩溃:

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "stderr" referenced by "libhello-android-jni.so"..

我尝试将 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: error: undefined reference to 'stderr' collect2.exe: error: ld returned 1 exit status

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

我读到 stderr 等在某个时间点从 Android NDK header 中删除,因为它们在 libc 中成为真正的功能,但我不太确定如何解决此问题,因为将 platformVersion 设置为较低的值(如某些问题中所建议的那样)没有帮助。如果能提供正确方向的指示,我将不胜感激。

最佳答案

原来我追错了东西。 ASI SDK 是针对 glibc 静态编译的,其中包含 stderr 作为全局可用的符号,而 bionic(Android libc)不包含它们。

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

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

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

...

关于安卓NDK : undefined reference to 'stderr' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39322852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com