私はARM用にコンパイルされたライブラリを持っています。私はソースコードにアクセスできない。私は自分のアプリでこのライブラリを使いたい。このアプリは、x86ベースのAVDで実行する必要があります(パフォーマンス上の理由から)。houdini(Androidエミュレータ)を搭載したx86ベースのAVDでARMライブラリを実行
問題は、houdiniを使用してx86環境でこのARMライブラリを実行する方法がわかりません。私はhoudini-libsをダウンロードし、/system/lib/
respにコピーしました。 /system/lib/arm/
に送信し、私のAPKを実行しようとしました。
私は3つの異なるアプローチを試してみましたが、すべて失敗しました:
私は普遍のインストールを
/lib/armeabi/
にARMライブラリをコピーして、Gradleのフラグでsplits { abi { enable true reset() include 'x86', 'armeabi' universalApk true } }
それをコンパイルする場合-apkは
Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113]
で失敗します。/lib/armeabi/
にARMライブラリをコピーし、universalApk false
でコンパイルすると、結果のx86-apkにlibが存在しません。ライブラリ呼び出しは、... couldn't find "libXYZ.so"
で失敗します(存在しないため、明らかです)。/lib/x86/
にARMライブラリをコピーすると、ライブラリ呼び出しがjava.lang.UnsatisfiedLinkError: dlopen failed: "/data/app/com.jni.example/lib/x86/libXYZ.so" has unexpected e_machine: 40
で失敗します。機械コード40はARMです(そしてそれは正しいことですが、ライブラリは本当にARMです)が、なぜこれがhoudiniによって翻訳されないのか分かりません。
x86-エミュレータでARMライブラリを実行する方法はありますか? houdiniを設定するには?
ありがとうございます!
編集:私はGenymotionの個人的なバージョンを使用しようとしたと、このスレッドからフーディーニ・ライブラリ点滅
:http://forum.xda-developers.com/showthread.php?t=2528952
すべてがうまく働いたが、問題があるライブラリ・コールは今で失敗します新しいエラー:
D/dalvikvm: Trying to load lib /data/app-lib/com.jni.example-1/libXYZ.so 0xa4df6228
D/dalvikvm: VFY: replacing opcode 0x62 at 0x0002
I/dalvikvm: DexOpt: unable to optimize static field ref 0x3d6d at 0x10 in Lio/netty/util/internal/logging/Log4JLogger;.debug
D/houdini: [1481] Loading library(version: 3.2.1.43093 RELEASE)... successfully.
D/houdini: [1481] Open Native Library /data/app-lib/com.jni.example-1/libXYZ.so failed.
E/dalvikvm: dlopen("/data/app-lib/com.jni.example-1/libXYZ.so") failed: dlopen failed: "/data/app-lib/com.jni.example-1/libXYZ.so" has unexpected e_machine: 40
W/System.err: java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app-lib/com.jni.example-1/libXYZ.so" has unexpected e_machine: 40
誰でもこれを修正する方法を知っていますか?
私は、ライブラリのネイティブのx86バージョンに私の手を得ることができました。しかし、おそらく他の誰かがあなたのフーディーニへのリンクから利益を得ることができます。ありがとう! – phlo