2

libjpeg-turbo を使用する Android アプリ用のネイティブ ライブラリがあります。NDK を使用してライブラリと libjpeg-turbo をコンパイルしています。すべてが正常にコンパイルおよびインストールされているようです (電話の /data/data/com.company.app/lib にすべての .so ファイルが表示されます)。

System.loadLibrary("jpeg");
System.loadLibrary("zmq");
System.loadLibrary("MySuperLib");
System.loadLibrary("jnilibwrapper");

E/AndroidRuntime(8186): java.lang.UnsatisfiedLinkError: dlopen に失敗しました: "libjnilibrapper.so" が必要とするライブラリ "libMySuperLib.so" を読み込めませんでした。「libMySuperLib.so」に必要なライブラリ「libjpeg.so.62」を読み込めなかったことが原因です。ライブラリ「libjpeg.so.62」が見つからないことが原因

この回避策を見つけて、lib のシンボリック リンクを作成すると、このエラーが渡されます

root@klteatt:/data/data/com.company.app/lib # ln -s libjpeg.so libjpeg.so.62

もちろん、それは解決策ではありません。

どこが間違っているのでしょうか?libjpeg.so.62 が具体的に必要なのはなぜですか?

4

1 に答える 1

1

この問題は、コンパイル時に のバージョン管理された sonameMySuperLibとリンクされているために発生します。libjpeg-turboAndroid の JNI ランタイムは現在、バージョン管理された動的ライブラリをサポートしていません。そのため、バージョン管理されていないlibjpeg.sosoname しか想定していないため、「見つける」ことができません。

libjpeg-turboバージョン情報なしでコンパイルする方法の 1 つは、 に渡されるlibjpeg-turboの変数を変更することです。変数をのフラグを含むように変更することで、バージョン情報が埋め込まれたライブラリの作成を回避しようとします。バージョン管理されていない共有ライブラリを作成することは、通常はひどい考えですが、この時点で共有ライブラリを Android に実際に「インストール」することはできないため、バージョン管理されていない.Makefile.am *LDFLAGSlibtool*LDFLAGSlibtool-avoid-versionlibtoolMySuperLiblibjpeg.so

バージョン管理されていない libjpeg.so を生成するへlibjpeg-turboのパッチの例を次に示します。Makefile.am

--- Makefile.am 2014-08-28 09:57:37.000000000 -0700
+++ Makefile.am.patched 2014-08-28 09:57:20.000000000 -0700
@@ -1,5 +1,5 @@
 lib_LTLIBRARIES = libjpeg.la
-libjpeg_la_LDFLAGS = -version-info ${LIBTOOL_CURRENT}:${SO_MINOR_VERSION}:${SO_AGE} -no-undefined
+libjpeg_la_LDFLAGS = -avoid-version -no-undefined
 include_HEADERS = jerror.h jmorecfg.h jpeglib.h

 if WITH_TURBOJPEG

詳細なオプションと情報については、libtool のリンクモード マニュアルへのリンクを次に示します

于 2014-09-08T20:27:16.260 に答える