2016-03-02 76 views
8

我試圖運行一個集成了android ndk的Library的演示應用程序。我已經在Android studio中導入了this代碼,並且還下載了ndk並將其與項目鏈接。代碼編譯併成功構建。它給人以異常崩潰 「異常ljava郎unsatisfiedlinkerror扔在初始化」, 「失敗:dlopen的失敗:無法找到符號 」_ZN7Tangram11setPositionEdd「 由 」libtangram.so「 引用...」Android NDK異常失敗: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) 

模塊搖籃文件:

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"); 
    } 

我谷歌這個問題,並在這些職位Link1Link2Link3Link4中提到,它可能是在API 21或更高版本編譯和舊設備上運行它的問題。但是我的APP_PLATFORM:= android-19在我的Application.mk中並且得到這個異常。

任何幫助?

+0

請發佈您的代碼,例如makefile等 – Mine

+0

我見過這個問題出現過幾次 - 一次是因爲系統試圖使用它自己的庫版本(比如在你的Link2中),一次是因爲我使用的代碼是用不同版本的NDK比我的應用程序中的本機代碼。您是否使用過nm工具(包含在NDK中)來檢查符號是否由libtangram.so實際導出?這篇文章可能會幫助你:http://stackoverflow.com/questions/23044815/compiling-c-library-for-android-but-no-symbols-found –

+0

爲什麼你有'LOCAL_ALLOW_UNDEFINED_SYMBOLS:= true'在你的Android.mk文件? – odexcide

回答

1

它看起來像你試圖從你自己的自定義ndk構建編譯tangram項目,而不是他們推薦的構建過程(https://github.com/tangrams/tangram-es#android)。使用他們的構建過程make來創建libtangram.so文件,然後將該.so文件複製到您的應用程序的本機庫目錄中。

找不到這些符號的原因是因爲在使用ndk構建時您沒有包含定義這些函數的適當源文件。通過ingnoring未定義的符號,它將編譯,但無法在運行時解決它們。

您缺少的符號是從Tangram::setPosition(double, double)創建的,其定義爲https://github.com/tangrams/tangram-es/blob/master/core/src/tangram.cpp#L318;但是,您的Android.mk文件不包含該源文件。

相關問題