2016-03-02 2 views
8

Я пытаюсь запустить демонстрационное приложение 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 и получаю это исключение.

Любая помощь?

+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-build в отличие от их рекомендуемого процесса сборки (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 не включает этот исходный файл.