サードパーティコードをAndroid用にクロスコンパイルし libXXXXX.so を作成してみました。アプリはAndroid Studioでビルドは成功したのですが、アプリ実行時に以下にエラーになります。
logcat エラーログ
java.lang.UnsatisfiedLinkError: dlopen failed: library "libXXXXX.so.0" not found
libXXXXX.so.0 の so.0 がなんとなく原因と思っているのですが、Android Studioで対処方法がわからずにいます。
readelfコマンドで見ると以下です。
$readelf -d libXXXXX.so | grep SONAME
0x000000000000000e (SONAME) Library soname: [libXXXXX.so.0]
CMakeLists.txtは以下です
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} )
Java コードは以下です。
static {
System.loadLibrary("hello-jni");
}
・libXXXXX.so.0 も so ファイルと同じ場所に置いてもエラーのままでした。
・また libXXXXX.a(STATIC LIBRARY)の場合も試し、これは実行も正常に出来ました。
CMakeLists.txtにSONAME関連のオプションを付けたりするのでは?と思い調べたのですが、よくわかりませんでした。解決方法をよろしくお願いいたします。
状況が変わりました。
loadLibraryを行っていませんでした。
static {
System.loadLibrary("XXXXX");
System.loadLibrary("hello-jni");
}
新たなlogcat エラーログ
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol **"acos"** referenced by "...libXXXXX.so"...
acos がないエラーなのですが、Androidに acos は存在しないのでしょうか?解決は難しいでしょうか?よろしくお願いいたします。
以下のように変更してみましたが、状況は変わりません(同じエラーのまま)
CMakeLists.txt
target_link_libraries( hello-jni libXXXXX m ${log-lib} )
Java コード
static {
System.loadLibrary("m");
System.loadLibrary("XXXXX");
System.loadLibrary("hello-jni");
}
引き続きよろしくお願いいたします。