2016-03-02 10 views
8

android ndkが組み込まれたLibraryのデモアプリケーションを実行しようとしています。私はAndroidスタジオにthisコードをインポートし、またndkをダウンロードしてプロジェクトにリンクしました。コードがコンパイルされ、正常にビルドされます。失敗しました " "初期化中に投げられないUnsatisfiedLinkError LANG ljava例外" それは例外でクラッシュを与える:dlopenのに失敗しました:" ...Android NDK例外が失敗しました:dlopen failed: "libtangram.so"によって参照されるシンボル "_ZN7Tangram11setPositionEdd"を見つけることができません

Application.mkを "libtangram.so" によって参照されるシンボル "_ZN7Tangram11setPositionEdd" を見つけることができません。

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のクラス・ロード・ライブラリで10

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

私はこの問題をGoogleとこれらの記事でLink1Link2Link3Link4 API 21以降でコンパイルし、古いデバイス上でそれを実行している問題であり得ることを述べています。しかし、私はあなたのApplication.mkでAPP_PLATFORM:= android-19に気を付けて、この例外を取得しています。

ヘルプ

+0

コードを投稿してください。 makefileなど – Mine

+0

私はこの問題を数回見てきました。システムが(Link2のような)独自のバージョンのライブラリを使用しようとしていたからです。一度、別のバージョンのコンパイルされたコードを使用していたからです私のアプリケーションのネイティブコードよりもNDKです。シンボルが実際にlibtangram.soによってエクスポートされているかどうかを確認するには、nmツール(NDKに含まれています)を使用しましたか?この投稿はあなたに役立つかもしれません:http://stackoverflow.com/questions/23044815/compiling-c-library-for-android-but-no-symbols-found –

+0

なぜあなたはあなたの 'LOCAL_ALLOW_UNDEFINED_SYMBOLS:= true'を持っていますか? Android.mkファイル? – odexcide

答えて

1

推奨ビルドプロセス(https://github.com/tangrams/tangram-es#android)ではなく、独自のカスタムndk-buildからtangramプロジェクトをコンパイルしようとしたようです。 makeでビルドプロセスを使用してlibtangram.soファイルを作成し、その.soファイルをアプリ用のネイティブライブラリディレクトリにコピーします。

これらのシンボルが見つからない理由は、ndkでビルドするときに、それらの関数を定義する適切なソースファイルが含まれていないためです。未定義のシンボルを組み込むことによって、コンパイルされますが、実行時にそれらを解決することはできません。

あなたが欠けているシンボルは、https://github.com/tangrams/tangram-es/blob/master/core/src/tangram.cpp#L318で定義されたから作成されます。ただし、Android.mkファイルにはそのソースファイルは含まれていません。

関連する問題