2016-07-06 16 views
2

現在、共有ライブラリを使用するNDKプロジェクトで作業しています。そして、私は、統合する2つの共有ライブラリlibsatprotocol.soとlibsat-tanca.soを持っています。Android NDKリンカの間違ったパス

私はこれらのライブラリをAndroid.mkに追加してラッパーを作りました。 libsatprotocolについては、すべて正常に動作しています。しかしlibsat-tancaのために、私はAndroid上でクラッシュを取得:

java.lang.UnsatisfiedLinkError: dlopen failed: could not load library "/home/lucas/Rockspoon/satlib/Android/app/src/main/obj/local/armeabi/libsat-tanca.so" needed by "libsat-jni.so"; caused by library "/home/lucas/Rockspoon/satlib/Android/app/src/main/obj/local/armeabi/libsat-tanca.so" not found 
                       at java.lang.Runtime.loadLibrary(Runtime.java:371) 
                       at java.lang.System.loadLibrary(System.java:989) 

はとても奇妙なことは、このライブラリの私のコンピュータのパスでパス、と私はそれを取得しているところから見当もつかないということです。依存関係のlibsat-tancaを削除すると、libsatprotocolでうまく動作します。

LOCAL_PATH := $(call my-dir) 
#LOCAL_ALLOW_UNDEFINED_SYMBOLS=true 

include $(CLEAR_VARS) 

LOCAL_MODULE := sat-tanca 
LOCAL_SRC_FILES := tanca/$(TARGET_ARCH_ABI)/libsat-tanca.so 

include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 

LOCAL_MODULE := sat-dimep 
LOCAL_SRC_FILES := dimep/$(TARGET_ARCH_ABI)/libsatprotocol.so 

include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 

LOCAL_MODULE := sat-jni 
LOCAL_SRC_FILES := satlib.c 
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -lz -llog 
LOCAL_SHARED_LIBRARIES := sat-tanca sat-dimep 

include $(BUILD_SHARED_LIBRARY) 

Application.mk

APP_ABI := armeabi #armeabi-v7a mips x86 x86_64 
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libsatprotocol.so $(TARGET_ARCH_ABI)/libsat-tanca.so 

SATControl.java

static { 
    System.loadLibrary("sat-jni"); 
} 

build.gradle(アプリ)

プラグインを適用します。ここでは

は私Android.mkがあります: 'com.android.application'

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.3" 

    defaultConfig { 
     applicationId "com.rockspoon.libraries.satlib" 
     minSdkVersion 19 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
     ndk { 
      moduleName "sat-jni" 
     } 
    } 

    sourceSets.main { 
     jni.srcDirs = [] // This prevents the auto generation of Android.mk 
     jniLibs.srcDir 'src/main/libs' // This is not necessary unless you have precompiled libraries in your project. 
    } 

    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

    task buildNative(type: Exec, description: 'Compile JNI source via NDK') { 
     def ndkDir = android.ndkDirectory 
     commandLine "$ndkDir/ndk-build", 
       '-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source 
       '-j', Runtime.runtime.availableProcessors(), 
       'all', 
       'NDK_DEBUG=1' 
    } 

    task cleanNative(type: Exec, description: 'Clean JNI object files') { 
     def ndkDir = android.ndkDirectory 
     commandLine "$ndkDir/ndk-build", 
       '-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source 
       'clean' 
    } 

    clean.dependsOn 'cleanNative' 

    tasks.withType(JavaCompile) { 
     compileTask -> compileTask.dependsOn buildNative 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:appcompat-v7:23.4.0' 
} 

私のPCパスにlibsat-tanca.soだけをリンクする理由は何ですか?

答えて

1

私には間違って見えることが2つありますが、リンクパスが正しくない原因がわかりません。

1)この行の$(SYSROOT)変数は、マシン上のパスを指していますか?

LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -lz -llog 

にzlibにリンクし、ログライブラリが目標である場合は、あなただけの次を使用することができますし、ビルドが正しいことを行います:

LOCAL_LDLIBS += -lz -llog 

2)はなぜ、あなたに次の行がありますApplication.mk?これは必要ありませんが、リンクの問題を引き起こす可能性は低いと思います。

LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libsatprotocol.so $(TARGET_ARCH_ABI)/libsat-tanca.so 
+0

これは問題の原因ではありませんが、リンカーのバグです。私のワークラウンドは、ダイナミックローダーを使用してこれらのライブラリをロードし、JNIプロジェクト構造全体を変更して、リンクする代わりにファイルを挿入することでした。これは誰のための解決策ではなく、私のために働いた。 –

+0

私はこの文脈で有効であるので、私はあなたの答えを受け入れます。 –

関連する問題