我想在Android应用程序中使用ASI SDK(预构建的二进制文件)。我在Windows 10上使用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);
}
build.gradle
模块的app
如下所示:
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
模块。这是build.gradle
模块的libusb
文件(名为&#34; usb&#34;):
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失败:找不到符号 &#34; stderr的&#34;由&#34; libhello-android-jni.so&#34; ..
引用
我尝试将supc++
和/或stdc++
添加到ldFlags
,我尝试将文件扩展名更改为cpp
并返回c
,我已经尝试在build.gradle文件中将platformVersion
设置为19或甚至9,但这只会导致编译时错误表示未定义stderr
:
C:\用户\ greuff \文件\ devel的\ AndroGuide \应用\ SRC \主\ JNI \驱动\ ASI \ lib中\ 86 \ libASICamera2.a(ASICamera2.o):ASICamera2.cpp:功能 ASIGetNumOfConnectedCameras:错误:未定义引用&#39; stderr&#39; collect2.exe:错误:ld返回1退出状态
奇怪的是,此错误仅发生在x86
平台目标上。
我读到在某个时间点从Android NDK标头中移除了stderr
等因为它们在libc
中成为真正的功能,但我不太确定如何解决这个问题因为将platformVersion
设置为较低的值(如某些问题所示)并没有帮助。我非常感谢正确方向的指示。
答案 0 :(得分:7)
原来我正在追逐错误的事情。 ASI SDK是针对glibc静态编译的,其中包含<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/lvData"
android:layout_width="match_parent"
android:layout_height="fill_parent">
</ListView>
</RelativeLayout>
作为全局可用符号,而bionic(Android libc)不包含它们。
我所要做的就是取消定义stderr
并将其自己创建为链接符号,以便链接器可以找到它:
stderr