2013-05-13 6 views
8

を読み込むことができません私はゲームを書いています、と私は巨大なネイティブライブラリを持って、私はライブラリ

static { 
     try { 
      System.loadLibrary("mylib"); 
     } catch (UnsatisfiedLinkError e) { 
      Log.d(TAG, "Unsatisfied Link error: " + e.toString()); 
     } 
    } 

ように私のメインの活動で私のネイティブライブラリをロードしようとしている私が持っていますこのコードを社内の多くのデバイスでテストしましたが、このエラーは発生しません。私の出版物からは、 "が原因でログが取得されます:java.lang.UnsatisfiedLinkError:ライブラリをロードできません"。注:このクラッシュは普遍的ではなく、わずかしか人がこのクラッシュを受けていません

  • エクスポートされたapkにライブラリが置かれているのは問題ですか?私は今ライブラリを/libs/armabi/libmylib.soにeclipseによって自動的に入れましたか?
  • アンドロイドのバージョンとは関係がありますか?私は2.3(APIレベル9)以来のAndroidのバージョンをサポートしています
  • または別の場所からライブラリをロードする必要がありますか?
  • 何か非常に重要なものがありません
  • アプリケーション全体がSDCARDにインストールされていると問題がありますか?クラッシュの

詳細は次のとおりです。load_segments:68には、アプリケーションがデバイスのほとんどで正常に動作し、のみ、時にはあなたにエラーを与えることを考慮mylib.so

+0

私は巨大なネイティブライブラリを持っています、どのように巨大ですか?たぶんそれはいくつかのメモリ要件を満たしておらず、システムをロードできないかもしれません。 – Blackbelt

+0

〜7MB(デバッグ版) – Shri

+0

メモリの問題ではありません。どのデバイスでこの問題を期限切れにしましたか? – Blackbelt

答えて

14

からセグメントをマッピングすることができなかった、それは仮定しても安全ですライブラリがAPKに正しくパッケージ化され、サイズ/メモリフットプリントも許容されることを確認してください。

このように、私は気まぐれで、ライブラリのビルド/コンパイルのアーキテクチャに問題があることをお勧めします。ほとんどの新しいAndroidデバイスはARM7プロセッサを使用しています。ライブラリがARM7アーキテクチャに対してもコンパイルされている可能性は非常に高いです。いくつかの古いデバイス、特にAndroid 2.3を使用しているデバイスは、ARM7プロセッサと順方向互換ではないARM6プロセッサを使用しています(テスト用のデバイスは、Android 2.3.3を実行するLG GT540です)。 ARM7用に設計されたアプリケーションを古いARM6携帯電話で実行しようとしたときに、私が指摘したようなエラー(load_segments:68はセグメントをmylib.soにマップできませんでした)に似たクラッシュを見ました。

この問題を回避行くの3つの方法があります:

  1. は、両方のアーキテクチャに対するライブラリをコンパイルし、APKに二つの別々の.soファイルが含まれますが。その後、実行時にプロセッサのタイプを決定し、正しいものをロードします。率直に言って、これが可能かどうかは分かりません。

  2. 2つの別々のapkファイル(ARM6用とARM7用)を作成し、マニフェストのフィルタを使用して対応するアーキテクチャを指定します。同じアプリのGoogle Playに両方をアップロードすることができます。マニフェストのフィルタは、どのデバイスにダウンロードされるかを制御します。

  3. マニフェストにデバイス要件を指定することでARM7アーキテクチャのみをサポートします。顧客の聴衆を失ってしまいますが、アプリケーションの2つのバージョンを管理する作業が少なくなります。

EDIT: NDKのドキュメントによると、それは一度に異なるアーキテクチャのために複数のライブラリを生成することができます。そして、ビルドプロセスは、ネイティブライブラリの異なるバージョンを作成します、例えば

APP_ABI := arch1 arch2 arch3 ... 

APP_ABI := armeabi armeabi-v7a mips 

を:あなたはApplication.mkファイルに次の行を追加することで、ターゲットとするCPUを具体的に制御することができます。これらのバージョンは、ディレクトリの最終apkに配置する必要があります

lib/<abi>/lib<name>.so 

ここで、名前はアーキテクチャの名前です。

System.loadLibrary("<name>"); 

また、アーキテクチャごとに別々のapkファイルを作成し、Google Playでマルチapk機能を使用することもできます。

アーキテクチャターゲティングに関するすべての情報は、NDKのdocsサブディレクトリのファイルCPU-ARCH-ABIS.htmlファイルにあります。

+0

広く私はあなたの答えを受け入れる、私はあなたが示唆しているものは論理的だと思います。しかし、マニフェストや、amrv6とarmv7のために特別に構築できるオプションがあるかどうかはわかりませんが、私はアンドロイドマニフェストを通じてこれを修正する方法を見つけることができませんでした – Shri

+1

@techjeeviアーキテクチャはapkマニフェストでは指定されていませんが、ネイティブライブラリのファイルをビルドします。後でビルドアプリに組み込まれ、Google Playで使用されます。私は例を見つけるためにいくつかの掘り下げを行います。 –

+1

@techjeevi異なるバージョンのネイティブライブラリを使用して異なるアーキテクチャーをターゲットにする方法の詳細と、詳細な情報の入手先について、私の答えを更新しました。 –