2016-12-21 2 views
3

私はAndroid開発の新人ではありませんが、NDKと.soライブラリについて話す際には全く新しい初心者です。Android:異なるアーキテクチャーのためのndk .soライブラリを含む、アプリケーションのクラッシュ

私が開発しているアプリはサードパーティのSDKを使用し、いくつかの.soファイルを提供しています。彼らは私にすべてのアーキテクチャ(これまでのところ、arm64-v8a、armeabi、armeabi-v7a、mips、mips64、x86、x86_64)の.soファイルを提供しています。

新しいサードパーティSDKを追加する必要がありますが、armeabi-v7aとx86の.soファイルのみを提供します。私は私のアプリを実行しようとすると 、それがクラッシュし、私は(私はlogcatにそれを参照してください)SDKからエラーが出るように述べている:

SDKNAMEは現在だけarmeabi-v7aの構築済みのライブラリを提供し、 x86アーキテクチャ

これは一般的なシナリオですか?この種のシナリオを修正する方法はありますか?

事前のおかげでたくさんの

+0

私のことでは、 armeabi-v7aまたはx86アーキテクチャ用のプロジェクトを構築することしかできませんでした。使用しているビルドバリアントを確認してください。そうでない可能性が高いです。 – ortisenderos

+1

ビルド設定でアーキテクチャを指定していません。繰り返しますが、私はスーパーn00bです。 私はこれを見つけました: https://developer.android.com/studio/build/configure-apk-splits.html あなたはそれが助けることができると思いますか? – aarcoraci

+0

Android StudioやEclipse、設定ファイルなどの詳細情報を提供する必要があります。 – ortisenderos

答えて

1

ストアアプリ/ srcに/メイン/ jniLibs/{}アーチ例えばであなたのコンパイルされたライブラリ:その後、armeabi/armeabi-v7aとは、あなたに記事の最後に行を追加します。 apps build.gradle。

productFlavoursは、コンパイルバリアントを構成するために使用されます。この方法で、すでにコンパイルされたライブラリを適切にリンクすることができます。

android.ndk { 
     moduleName = "your_library_jni" 
     cppFlags.add("-fexceptions") 
     cppFlags.add("-std=c++11") 
     cppFlags.add("-I" + file("src/main/jni").absolutePath) 
     } 

android.productFlavors { 
     create("x86") { 
      ndk.with{ 
       abiFilters.add("armeabi") 

       File curDir = file('./') 
       curDir = file(curDir.absolutePath) 
       String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi/" 

       ldLibs.add(libsDir + "libyour_module.so") 

      } 
     } 
     create("arm-v7a") { 
      ndk.with { 
       abiFilters.add("armeabi-v7a") 

       File curDir = file('./') 
       curDir = file(curDir.absolutePath) 
       String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi-v7a/" 

       ldLibs.add(libsDir + "libyour_module.so") 

      } 
     } 
    } 
3

アプリケーションがサポートするすべてのアーキテクチャですべてのライブラリを使用できるようにする必要があります。

APKがインストールされると、インストーラはAPKをスキャンして、サポートするアーキテクチャを探します。 APKにネイティブコードが含まれていない場合は、すべてのアーキテクチャがサポートされます。ただし、ネイティブコードを含めると、APKに含まれるアーキテクチャのみがサポートされます。最新のデバイスは、複数のアーキテクチャをサポートしています。たとえば、デバイスがarm64-v8aarmeabi-v7a、またはx86_64x86、またはx86armeabi-v7a(エミュレーションを介して)をサポートしている可能性があります。インストール時には、どのアーキテクチャが含まれているかを調べ、それらのアーキテクチャのうち最も推奨されるアーキテクチャを選択し、そのアーキテクチャからすべてのライブラリをインストールします。残りは無視します。 (以前のAndroidのバージョンでは、説明したようなケースで意図しない動作が発生する可能性があります(https://stackoverflow.com/a/25648943/3115956を参照してください)。

ここに含まれるライブラリのうち1つが使用可能なすべてのアーキテクチャ用にビルドされ、いくつか、インストーラは、例えば、 arm64-v8aとなり、必要なライブラリをすべて取得することはできません。

したがって、すべてのライブラリで提供されるアーキテクチャの共通部分のみをサポートできます。

これを実現するために、あなたが手動より多くのアーキテクチャを提供したSDKから余分なディレクトリを削除することができ、またはあなたのAPKを構築するためのGradleを使用している場合、あなたはNDKブロックにこれを追加することができます。

abiFilters 'armeabi-v7a', 'x86' 
関連する問題