Android NDK 异常失败:dlopen 失败:无法找到 "libtangram.so" 引用的符号“_ZN7Tangram11setPositionEdd”
Android NDK Exception failed: dlopen failed: cannot locate symbol "_ZN7Tangram11setPositionEdd" referenced by "libtangram.so"
我正在尝试 运行 Android studio 中 Library in which android ndk is integrated. I have imported this 代码的演示应用程序,还下载了 ndk 并将其与项目链接。代码编译并成功构建。它给出了异常 "exception ljava lang unsatisfiedlinkerror thrown while initializing" "failed: dlopen failed: cannot locate symbol "_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 class 中加载库:
static {
System.loadLibrary("c++_shared");
System.loadLibrary("tangram");
}
我 google 这个问题和这些帖子 Link2 Link3 Link4 提到它可能是在 api 21 或更高版本编译和 运行ning 它的问题在旧设备上。但是我在我的 Application.mk 中提到了 mentioend APP_PLATFORM := android-19 并得到了这个异常。
有帮助吗?
您似乎试图从您自己的自定义 ndk-build 编译 tangram 项目,而不是他们推荐的构建过程 (https://github.com/tangrams/tangram-es#android)。使用他们的构建过程 make
创建 libtangram.so 文件,然后将该 .so 文件复制到您的应用程序的本机库目录中。
它找不到这些符号的原因是因为您在使用 ndk 构建时没有包含定义这些函数的适当源文件。通过忽略未定义的符号,它将编译但无法在运行时解析它们。
您缺少的符号是从 Tangram::setPosition(double, double)
创建的,它在 https://github.com/tangrams/tangram-es/blob/master/core/src/tangram.cpp#L318 处定义;但是,您的 Android.mk 文件不包含该源文件。
我正在尝试 运行 Android studio 中 Library in which android ndk is integrated. I have imported this 代码的演示应用程序,还下载了 ndk 并将其与项目链接。代码编译并成功构建。它给出了异常 "exception ljava lang unsatisfiedlinkerror thrown while initializing" "failed: dlopen failed: cannot locate symbol "_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 class 中加载库:
static {
System.loadLibrary("c++_shared");
System.loadLibrary("tangram");
}
我 google 这个问题和这些帖子
有帮助吗?
您似乎试图从您自己的自定义 ndk-build 编译 tangram 项目,而不是他们推荐的构建过程 (https://github.com/tangrams/tangram-es#android)。使用他们的构建过程 make
创建 libtangram.so 文件,然后将该 .so 文件复制到您的应用程序的本机库目录中。
它找不到这些符号的原因是因为您在使用 ndk 构建时没有包含定义这些函数的适当源文件。通过忽略未定义的符号,它将编译但无法在运行时解析它们。
您缺少的符号是从 Tangram::setPosition(double, double)
创建的,它在 https://github.com/tangrams/tangram-es/blob/master/core/src/tangram.cpp#L318 处定义;但是,您的 Android.mk 文件不包含该源文件。