2016-03-02 18 views
8

Android ndk'nin entegre edildiği Library bir demo uygulamasını çalıştırmaya çalışıyorum. Android stüdyosunda this kodunu aldım ve ayrıca ndk’yi indirdim ve projeyle ilişkilendirdim. Kod derler ve başarıyla oluşturur. Başarısız " "başlatılırken atılmış unsatisfiedlinkerror lang ljava istisna" Bu istisna ile kazasında verir: dlopen başarısız oldu:" ...Android NDK Exception başarısız oldu: dlopen başarısız oldu: "libtangram.so" tarafından başvurulan "_ZN7Tangram11setPositionEdd" sembolünü bulamıyor

Application.mk "libtangram.so" tarafından başvurulan sembol "_ZN7Tangram11setPositionEdd" bulamaz:

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) 

Modül Gradle Dosya:

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 sınıfı yük kütüphanelerinde 10

:

static { 
     System.loadLibrary("c++_shared"); 
     System.loadLibrary("tangram"); 
    } 

Ben bu sorunu google ve bu mesajların buna API 21 veya daha yeni en derleme ve eski cihazlar üzerinde çalışan sorun olabilir bahsedilmektedir Link1Link2Link3Link4 içinde. Ama benim app.PLk uygulamasında APP_PLATFORM: = android-19 ve bu istisnayı alıyorum.

Herhangi Yardım? Onların tavsiye inşa sürecinde (https://github.com/tangrams/tangram-es#android) aksine kendi özel ndk-Yapı 'tangram projeyi derlemek çalıştı gibi

+0

örneğin kodunuzu, buraya gönderin Ben farklı bir sürümü ile derlenmiş kodu kullanarak çünkü bir kere sistemi (sizin LINK2 gibi) kütüphanenin kendi versiyonunu kullanmaya çalışıyorum çünkü bir kez ve - Bu konuyu gördüğüm vb makefile, – Mine

+0

birkaç kez gelip NDK, uygulamamdaki yerel koddan daha iyi. Sembolün gerçekten libtangram.so tarafından dışa aktarılıp aktarılmadığını kontrol etmek için (NDK'da bulunan) nm aracını kullandınız mı? Bu gönderi size şu konuda yardımcı olabilir: http://stackoverflow.com/questions/23044815/compiling-c-library-for-android-but-no-symbols-found –

+0

Neden "LOCAL_ALLOW_UNDEFINED_SYMBOLS: = true" var? Android.mk dosyası? – odexcide

cevap

1

görünüyor. Libtangram.so dosyasını oluşturmak için make ile kendi oluşturma işlemini kullanın ve sonra bu .so dosyasını uygulamanız için yerel kitaplık dizininize kopyalayın. Eğer NDK ile oluştururken bu işlevleri tanımlamak uygun kaynak dosyaları dahil edilmez çünkü bu semboller bulamıyorum

nedenidir. Tanımsız semboller tarafından tanımlandığında, derlenecek, ancak bunları çalışma zamanında çözemeyecektir.

Eğer https://github.com/tangrams/tangram-es/blob/master/core/src/tangram.cpp#L318 de tanımlanır Tangram::setPosition(double, double) oluşturulur eksik sembolü; Ancak, Android.mk dosyanız bu kaynak dosyayı içermez.