

サードパーティコードをAndroid用にクロスコンパイルし **libXXXXX.so** を作成してみました。アプリはAndroid
Studioでビルドは成功したのですが、アプリ実行時に以下にエラーになります。

logcat エラーログ

[code]

    java.lang.UnsatisfiedLinkError: dlopen failed: library "libXXXXX.so.0" not found
    
[/code]

libXXXXX.so.0 の **so.0** がなんとなく原因と思っているのですが、Android Studioで対処方法がわからずにいます。

readelfコマンドで見ると以下です。

[code]

    $readelf -d libXXXXX.so | grep SONAME
    0x000000000000000e (SONAME)             Library soname: [libXXXXX.so.0]
    
[/code]

CMakeLists.txtは以下です

[code]

    add_library( libXXXXX SHARED IMPORTED )
    
    set_target_properties( libXXXXX
        PROPERTIES
        IMPORTED_LOCATION ${LIB_ROOT}/cpp/libs/${ANDROID_ABI}/libXXXXX.so )
    
    add_library(hello-jni SHARED src/main/cpp/hello-jni.cpp )
    
    target_link_libraries( hello-jni libXXXXX ${log-lib} )
    
[/code]

Java コードは以下です。

[code]

    static {
        System.loadLibrary("hello-jni");
    }
    
[/code]

・libXXXXX.so.0 も so ファイルと同じ場所に置いてもエラーのままでした。  
・また libXXXXX.a(STATIC LIBRARY)の場合も試し、これは実行も正常に出来ました。

CMakeLists.txtにSONAME関連のオプションを付けたりするのでは？と思い調べたのですが、よくわかりませんでした。解決方法をよろしくお願いいたします。

**状況が変わりました。**

loadLibraryを行っていませんでした。

[code]

    static {
        System.loadLibrary("XXXXX");
        System.loadLibrary("hello-jni");
    }
    
[/code]

新たなlogcat エラーログ

[code]

    java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol **"acos"** referenced by "...libXXXXX.so"...
    
[/code]

acos がないエラーなのですが、Androidに acos は存在しないのでしょうか？解決は難しいでしょうか？よろしくお願いいたします。

**以下のように変更してみましたが、状況は変わりません（同じエラーのまま）**

CMakeLists.txt

[code]

    target_link_libraries( hello-jni libXXXXX m ${log-lib} )
    
[/code]

Java コード

[code]

    static {
        System.loadLibrary("m");
        System.loadLibrary("XXXXX");
        System.loadLibrary("hello-jni");
    }
    
[/code]

引き続きよろしくお願いいたします。


CC BY-SA 4.0
2018-06-27T07:38:09.210
45098
2023-04-17T15:07:25.823
2018-07-05T11:54:09.770
29084
29084
question
android android-studio
java.lang.UnsatisfiedLinkError: dlopen failed: library "libXXXXX.so.0" not found 発生


自分も同じような問題で調べていてたどり着きました。  
API24以降の制限についてのこんな資料を見つけました。  
<https://android.googlesource.com/platform/bionic/+/372f19e/android-changes-
for-ndk-developers.md#private-api-enforced-for-api-level-24>

> ネイティブライブラリは、パブリックAPIのみを使用し、非NDKプラットフォームライブラリとはリンクしてはいけません。API 24  
>
> からはこのルールが適用され、アプリケーションは非NDKプラットフォームライブラリを読み込むことができなくなりました。このルールはダイナミックリンカーによって強制されるため、コードがどのように読み込もうとしたかにかかわらず、パブリックでないライブラリにはアクセスできません。System.loadLibrary、DT_NEEDED  
>  エントリ、および dlopen(3) の直接呼び出しは、すべてまったく同じように動作します。


CC BY-SA 4.0
2022-01-04T02:41:18.963
85474
2022-01-04T03:46:47.020
2022-01-04T03:46:47.020
28571
28571
45098
answer