問題の説明
この例外は、インストールされたアプリにネイティブライブラリ(通常は .so ファイル)が含まれているものの、対応する CPU アーキテクチャのライブラリファイルがデバイスに存在しない場合に発生します。たとえば、開発者が ARMv7 ベースのアプリをコンパイルした場合に、そのアプリを Intel ベースのデバイスにインストールしようとすると、この例外が発生します。
解決策
この例外は、インストールされたアプリにネイティブライブラリ(通常は .so ファイル)が含まれているものの、対応する CPU アーキテクチャのライブラリファイルがデバイスに存在しない場合に発生します。アプリのコンパイル時に、NDK を使用して対応する CPU アーキテクチャのライブラリファイルをコンパイルすることをお勧めします。
1. Application.mk
ファイルを記述します。 jni ディレクトリ(hello-jni.c ディレクトリと同じレベル)に Application.mk
ファイルを作成し、次のコードをファイルに追加します。
APP_ABI := armeabi armeabi-v7a x86
このコードは、一度に 3 つのプロセッサ用の .so ファイルを生成できることを意味します。 Application.mk
ファイルが存在しない場合、または使用しない場合は、ndk-build パラメータに次のコードを追加します。
APP_ABI="armeabi armeabi-v7a x86 mips"
次のコードが実行されます。
ndk-build APP_ABI="armeabi armeabi-v7a x86 mips"
2. .so ファイルを生成します。 Android.mk
ファイルを記述した後、Android NDK パッケージの ndk-build スクリプトを使用して、次の方法で .so ファイルを生成できます。
mqc@ubuntu:~/workspace/android/NDK/hello-jni$ ls
AndroidManifest.xml assets bin default.properties gen jni libs obj res src
mqc@ubuntu:~/workspace/android/NDK/hello-jni$ ndk-build
Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserverGdbsetup : libs/armeabi/gdb.setupInstall : libhello-jni.so => libs/armeabi/libhello-jni.so
その後、hello-jni/libs
ディレクトリに 3 つの armeabi/armeabi-v7a/x86 フォルダが生成され、これらのフォルダに libhello-jni.so
ファイルが生成されます。
3. Eclipse で HelloJni プロジェクトを再コンパイルして、APK ファイルを生成します。 Eclipse で HelloJni プロジェクトを再コンパイルして、APK ファイルを生成します。 libhello-jni.so ファイルは APK ファイルに含まれています。