![](/img/trans.png)
[英]Android NDK : Getting java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol “signal” referenced by “libffmpeg.so”
[英]Android NDK Exception failed: dlopen failed: cannot locate symbol “_ZN7Tangram11setPositionEdd” referenced by “libtangram.so”
我正在嘗試運行集成了android ndk的Library的演示應用程序。 我已將此代碼導入Android Studio,還下載了ndk並將其與項目鏈接。 代碼編譯並成功構建。 它使崩潰,並帶有異常“初始化時引發異常ljava lang unsatisfiedlinkerror”“失敗:dlopen失敗:找不到由“ libtangram.so”引用的符號“ _ZN7Tangram11setPositionEdd” ...“
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");
}
我用谷歌搜索這個問題,在這些文章Link1 Link2 Link3 Link4中提到,這可能是在api 21或更高版本上編譯並在較舊的設備上運行它的問題。 但是我Application.mk中有mentioend APP_PLATFORM:= android-19並得到了這個異常。
有幫助嗎?
似乎您嘗試從自己的自定義ndk-build而不是其建議的構建過程( https://github.com/tangrams/tangram-es#android )編譯tangram項目。 將其生成過程與make
一起使用,以創建libtangram.so文件,然后將該.so文件復制到應用程序的本機庫目錄中。
找不到這些符號的原因是因為您沒有包括使用ndk進行構建時定義這些功能的適當源文件。 通過忽略未定義的符號,它將編譯但無法在運行時解析它們。
您缺少的符號是從Tangram::setPosition(double, double)
創建的Tangram::setPosition(double, double)
該文件在https://github.com/tangrams/tangram-es/blob/master/core/src/tangram.cpp#L318定義; 但是,您的Android.mk文件不包含該源文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.