Android NDK: неопределенная ссылка на stderrAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android NDK: неопределенная ссылка на stderr

Сообщение Anonymous »

Я хочу использовать ASI SDK (предварительно созданный двоичный файл) в приложении Android. Я использую Android Studio 2.1.3 в Windows 10 с «экспериментальным плагином» Gradle и Android NDK r12b.

Мой метод тестирования JNI, вызывающий базовую функцию SDK, выглядит следующим образом:

Код: Выделить всё

#include 
#include 
#include 

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 для приложения выглядит следующим образом:

Код: Выделить всё

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 (называемого «usb»):

Код: Выделить всё

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: невозможно найти символ
"stderr", на который ссылается "libhello-android-jni.so"..


Я пробовал добавить supc++ и/или stdc++ в ldFlags, я пытался изменить расширение имени файла на cpp и обратно на c, и я уже пытался установить для платформыVersion значение 19 или даже 9 в файлах build.gradle, но это привело только к ошибке Ошибка времени компиляции, сообщающая, что 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 (как предлагается в некоторых вопросах) не помогла. Буду очень признателен за указатели в правильном направлении.

Подробнее здесь: https://stackoverflow.com/questions/393 ... -to-stderr
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»