2017-11-09 16 views
2

Androidアプリ内でC++共有ライブラリを使用したいと考えています。 GoogleのNDKサンプルのhello-libsの例に沿ってフォローしようとしましたが、何とかうまくいきません。Androidスタジオ(cmake)で事前に構築された共有ライブラリを使用する

私のライブラリはAPKにパックされていないようです。私が見つけたすべてのチュートリアルは*.mkファイルを使用していますが、cmakeを使用します。

これは私のCMakeLists.txtです:

# Sets the minimum version of CMake required to build the native library. 
cmake_minimum_required(VERSION 3.4.1) 

# native lib 
add_library(native-lib SHARED 
      native-lib.cpp) 

set(IMPORT_DIR ${CMAKE_SOURCE_DIR}/../jniLibs) 

# shared lib 
add_library(shared-lib SHARED IMPORTED) 
set_target_properties(shared-lib PROPERTIES IMPORTED_LOCATION 
         ${IMPORT_DIR}/dynamic/lib/${ANDROID_ABI}/libLibrary.so) 
target_include_directories(native-lib PRIVATE 
          ${IMPORT_DIR}/dynamic/include) 

# linking libs 
target_link_libraries(native-lib 
         android 
         shared-lib 
         log) 

とすぐに、私は他の人と一緒にshared-libをリンクとしてアプリケーションを実行しているとき、私は、次のエラーを取得する:

E/art: dlopen("/data/app/my.package.name-1/lib/arm/libnative-lib.so", RTLD_LAZY) failed: dlopen failed: library "C:/projects/HelloLibs/app/src/main/cpp/../jniLibs/dynamic/lib/armeabi-v7a/libLibrary.so" not foun 
D/AndroidRuntime: Shutting down VM 
E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: my.package.name, PID: 29266 
        java.lang.UnsatisfiedLinkError: dlopen failed: library "C:/projects/HelloLibs/app/src/main/cpp/../jniLibs/dynamic/lib/armeabi-v7a/libLibrary.so" not found 
         at java.lang.Runtime.loadLibrary(Runtime.java:371) 
         at java.lang.System.loadLibrary(System.java:988) 
         at my.package.name.MainActivity.<clinit>(MainActivity.java:11) 
         at java.lang.reflect.Constructor.newInstance(Native Method) 
         at java.lang.Class.newInstance(Class.java:1690) 
         at android.app.Instrumentation.newActivity(Instrumentation.java:1078) 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2543) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2771) 
         at android.app.ActivityThread.access$900(ActivityThread.java:177) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1432) 
         at android.os.Handler.dispatchMessage(Handler.java:102) 
         at android.os.Looper.loop(Looper.java:135) 
         at android.app.ActivityThread.main(ActivityThread.java:5912) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at java.lang.reflect.Method.invoke(Method.java:372) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200) 

に見えますライブラリのようなものはデバイス上に見つかりません。さもなければ、librarieのパスは私のローカルmaschine上のものです。

+0

'dlopen("/data/app/my.package.name-1/lib/arm/libnative-lib.so "、RTLD_LAZY)'そのディレクトリを構築しましたか? 'lib/armeabi-v7a'ではないでしょうか? –

+0

@DanAlbert、いいえ:デバイス上で 'lib'の有効なパスは** arm **、** arm64 **、** x86 **、** x86_64 **です。なぜ私に尋ねないでください。 –

答えて

0

共有ライブラリ(.soファイル)を使用するためにCMakeを使う必要はありません。 src/main/jniLibsディレクトリの各ディレクトリ内にライブラリを置くだけです。次に、ライブラリを直接ロードすることができます。

Androidスタジオでネイティブメソッド宣言にエラーが表示されることがありますが、アプリは正常に動作します。

+0

しかし、 'native-lib-cpp'の中でどのようにライブラリを使うことができますか?共有ライブラリにはjni-methodsがありません。Android Studioの中に書かれた2番目のライブラリの中にそれらをラップしたいと思います。 – Dario

+0

あなたはまだjniLibsフォルダからtarget_link_librariesを使用できます。ディレクトリ –

1

prebuilt libLibrary.soにはSONAMEがありません。何らかの理由で最新のNDKでこのライブラリを再構築できない場合は、patchelfユーティリティを使用してSONAMEを既存のバイナリに追加することができます。

関連する問題