Я пытаюсь запустить демонстрационное приложение Library, в которое интегрирован Android-модуль ndk. Я импортировал код this в студию Android, а также скачал ndk и связал его с проектом. Код компилируется и строится успешно. Это дает сбой с исключением "исключением ljava Ланг unsatisfiedlinkerror выброшен при инициализации" "не удалось: dlopen не удалось: не удается найти символ "_ZN7Tangram11setPositionEdd", на который ссылается "libtangram.so" ..."Android NDK Exception failed: dlopen failed: не удалось найти символ «_ZN7Tangram11setPositionEdd», на который ссылается «libtangram.so»
Application.mk:
APP_STL := c++_shared
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi armeabi-v7a x86 mips
APP_PLATFORM := android-19
Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := tangram
LOCAL_SRC_FILES := jniExports.cpp jniGenerated.cpp platform_android.cpp
LOCAL_LDLIBS := -llog
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
include $(BUILD_SHARED_LIBRARY)
Модуль Gradle файла:
buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'com.github.dcendents:android-maven-plugin:1.2'
}
}
apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
group = GROUP
version = VERSION_NAME
android {
compileSdkVersion 22
buildToolsVersion "21.1.2"
defaultConfig {
minSdkVersion 15
targetSdkVersion 22
}
sourceSets.main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
jni.srcDirs = []
assets.srcDirs = ['core/resources']
}
task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {
commandLine "C:/Users/Administrator/AppData/Local/Android/android-ndk-r10e/ndk-build.cmd",
'NDK_PROJECT_PATH=build/intermediates/ndk',
'NDK_LIBS_OUT=jniLibs',
'APP_BUILD_SCRIPT=jni/Android.mk',
'NDK_APPLICATION_MK=jni/Application.mk'
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn ndkBuild
}
}
// Add gdb server to apk
afterEvaluate {
Sync packageTask = project.getTasks().findByName("packageReleaseJniLibs")
if (packageTask) { packageTask.include(['**/gdbserver', '**/gdb.setup']) }
packageTask = project.getTasks().findByName("packageDebugJniLibs")
if (packageTask) { packageTask.include(['**/gdbserver', '**/gdb.setup']) }
}
dependencies {
compile 'com.squareup.okhttp:okhttp:2.5.0'
compile 'xmlpull:xmlpull:1.1.3.1'
}
apply from: file('gradle-mvn-push.gradle')
В библиотеках нагрузки класса Java:
static {
System.loadLibrary("c++_shared");
System.loadLibrary("tangram");
}
Я Google этот вопрос и в этих постах Link1Link2Link3Link4 упоминается, что это может быть вопрос о составлении на апи 21 или более поздней версии и запустить его на старых устройствах. Но у меня есть mentioend APP_PLATFORM: = android-19 в моем Application.mk и получаю это исключение.
Любая помощь?
Пожалуйста, разместите свой код, например. makefile и т. д. – Mine
Я видел эту проблему несколько раз - один раз, потому что система пыталась использовать свою собственную версию библиотеки (например, в вашем Link2) и однажды, потому что я использовал код, скомпилированный с другой версией NDK, чем собственный код в моем приложении. Вы использовали инструмент nm (входит в NDK), чтобы проверить, действительно ли этот символ экспортируется libtangram.so? Этот пост может помочь вам в этом: http://stackoverflow.com/questions/23044815/compiling-c-library-for-android-but-no-symbols-found –
Почему у вас в LOCAL_ALLOW_UNDEFINED_SYMBOLS: = true? Android.mk файл? – odexcide