2016-05-16 8 views
1

私はいくつかのJNIコードを使用するAndroidアプリを持っています。 JNIライブラリを64ビットに変換することは、多くの変更が必要になるため、ほとんど不可能です。コード(JavaとJNIの両方)は、armeabi-v7aアーキテクチャでうまく動作します。Androidでarmeabi-v7aにCPU/ABIを強制的に送信

ライブラリはloadLibraryを使用してロードされています。 Nexus 6でアプリを実行しようとするとアプリが正常に読み込まれます。 loadLibraryが実行されるとすぐに、hereと記述されたエラーでアプリケーションがクラッシュします。

問題は、私が理解しているように、Nexus 6で実行すると、アプリケーションはarm64-8aとして構築されます。しかし、ライブラリはarm64-8aのために作られていません(64ビット版には質問の冒頭で言及した問題があります)。

私の質問は、arm64-8aデバイスもarmeabi-v7aコードを実行するよう強制できますか?私のアプリケーションapkをarmeabi-v7aにするにはどうすればデバイスに関係なく32ビットしか使用できないのですか?

答えて

5

はい、arm64-v8aデバイスでもarmeabi-v7aコードを実行できます。

APKをインストールすると、インストーラはパッケージに公式ディレクトリにライブラリが含まれているかどうかをチェックし、結果に応じてアクティビティを32または64ビットとしてマークします。

APK内のlib/arm64-v8a(通常はビルドディレクトリのディレクトリlibs/arm64-v8aから取得)でライブラリが見つかると、64ビットとマークされ、他のすべてのディレクトリは無視されます。 APK内のlib/armeabi-v7aまたはlib/armeabiにライブラリがある場合、プロセスは32ビットとしてマークされます。これらのいずれにもネイティブライブラリがない場合、インストーラはアプリケーションがネイティブコードをまったく使用しないと想定し、実際にはどちらのモードでも64ビットモードで実行することができます。

64ビットモードですべてのライブラリではなく一部を出荷すると、プロセスは64ビットモードで起動され、インストールされていない32ビットライブラリをロードできなくなります。この場合、すべてが利用可能でない限り、64ビットライブラリをバンドルする必要はありません。

公式のlibsディレクトリを使用せずに、ライブラリを他の方法でインストールする(実行時にファイルをダウンロードしたり、アセットなどに保存しておくなど)、システムではライブラリが32 (その時点で他のモードに切り替えるには遅すぎます)。このような場合は、アプリケーションを32ビットにフラグを立てるために、正規/公式に少なくともいくつかのダミーライブラリを含めるようにしてください。

同様の問題に対する回答については、https://stackoverflow.com/a/33919454/3115956,https://stackoverflow.com/a/27713998/3115956およびhttps://stackoverflow.com/a/35450911/3115956を参照してください。

+0

お返事ありがとうございます。私は、あなたが2番目のパラグラフで説明したことを邪魔する複雑さがあると思う - 私は外部依存関係(特に、レルムとアマゾンAWS)が定義されており、arm64-v8aをダウンロードしているようだ。 JNIライブラリを.aファイルに変更しましたが、適切にロードする方法がわかりません。私のライブラリーをロードしてから、ABIの選択に影響を及ぼす可能性のあるレルムなどを強制することはできますか?依存関係は、app build.gradleで定義されています。 'compile 'com.amazonaws:aws-android-sdk-s3:2.2.11'' – LNI

+0

ロードされるライブラリの実際の順序は関係ありません。重要なことは、APKに異なるABIディレクトリが存在することです。依存関係の1つに 'arm64-v8a'が含まれていると、このディレクトリはAPKで終了し、APKインストーラはこのアーキテクチャを選択します。ビルドされたAPK( 'unzip -l filename.apk')を見て、そこに含まれているアーキテクチャディレクトリを見てみましょう。しかし、あなたができることは、実際にどのABIを含めるかを選別することです。あなたのgradleファイルに 'abiFilters 'armeabi-v7a''を追加して、この単一のアーキテクチャだけを含めるようにしてください。 – mstorsjo

+0

別の64ビットライブラリが存在しない場合、アプリケーションがデフォルトで32ビットになっていることを確認できたので、答えが正しいとマークしました。私の場合、問題はrealm-androidによって引き起こされています - 私はrealmプラグインを有効にするためにappとproject build.gradleファイルの両方にエントリを持っています。これは、arm64-v8aライブラリを強制的に読み込むことでした。私はabiFiltersのステップを試して、それがうまくいくならばこのコメントを修正します。 – LNI

関連する問題