私はいくつかの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ビットしか使用できないのですか?
お返事ありがとうございます。私は、あなたが2番目のパラグラフで説明したことを邪魔する複雑さがあると思う - 私は外部依存関係(特に、レルムとアマゾンAWS)が定義されており、arm64-v8aをダウンロードしているようだ。 JNIライブラリを.aファイルに変更しましたが、適切にロードする方法がわかりません。私のライブラリーをロードしてから、ABIの選択に影響を及ぼす可能性のあるレルムなどを強制することはできますか?依存関係は、app build.gradleで定義されています。 'compile 'com.amazonaws:aws-android-sdk-s3:2.2.11'' – LNI
ロードされるライブラリの実際の順序は関係ありません。重要なことは、APKに異なるABIディレクトリが存在することです。依存関係の1つに 'arm64-v8a'が含まれていると、このディレクトリはAPKで終了し、APKインストーラはこのアーキテクチャを選択します。ビルドされたAPK( 'unzip -l filename.apk')を見て、そこに含まれているアーキテクチャディレクトリを見てみましょう。しかし、あなたができることは、実際にどのABIを含めるかを選別することです。あなたのgradleファイルに 'abiFilters 'armeabi-v7a''を追加して、この単一のアーキテクチャだけを含めるようにしてください。 – mstorsjo
別の64ビットライブラリが存在しない場合、アプリケーションがデフォルトで32ビットになっていることを確認できたので、答えが正しいとマークしました。私の場合、問題はrealm-androidによって引き起こされています - 私はrealmプラグインを有効にするためにappとproject build.gradleファイルの両方にエントリを持っています。これは、arm64-v8aライブラリを強制的に読み込むことでした。私はabiFiltersのステップを試して、それがうまくいくならばこのコメントを修正します。 – LNI