簡體   English   中英

Android NDK異常失敗:dlopen失敗:無法找到“ libtangram.so”引用的符號“ _ZN7Tangram11setPositionEdd”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM