8

私はゲームを書いていて、巨大なネイティブ ライブラリを持っています。次のようなメイン アクティビティでネイティブ ライブラリをロードしようとしています。

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

このコードを社内の多くのデバイスでテストしましたが、このエラーは発生しません。しかし、公開したものから、「Caused by: java.lang.UnsatisfiedLinkError: Cannot load library」というログを取得します。注: このクラッシュは普遍的なものではありません。このクラッシュを経験している人はごくわずかです。

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

クラッシュに関する詳細情報: load_segments: 68 failed to map segment from mylib.so

4

1 に答える 1

14

アプリがほとんどのデバイスで正しく動作し、エラーが発生するのはたまにしかないことを考えると、ライブラリが APK に正しくパッケージ化されており、そのサイズ/メモリ フットプリントも許容範囲内であると想定しても問題ありません。

そのため、私は気まぐれに進み、問題がライブラリのビルド/コンパイル アーキテクチャにあることを提案します。新しい Android デバイスのほとんどは、ARM7 プロセッサを使用しています。ライブラリが ARM7 アーキテクチャに対してもコンパイルされている可能性は非常に高いです。一部の古いデバイス、特に Android 2.3 を実行するデバイスは、ARM6 プロセッサを使用します (テストに使用するデバイスが 1 つあり、Android 2.3.3 を実行する LG GT540 です)、ARM7 アーキテクチャとの前方互換性はありません。古いARM6電話でARM7用に設計されたアプリを実行しようとしたときに、あなたが示したようなエラー(load_segments: 68 failed to map segment from mylib.so )でクラッシュが発生しました。

この問題を回避するには、次の 3 つの方法があります。

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

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

  3. マニフェストでデバイス要件を指定することにより、ARM7 アーキテクチャのみをサポートします。一部の顧客オーディエンスを失うことになりますが、アプリの 2 つのバージョンを維持するための作業は少なくなります。

編集: NDK のドキュメントによると、異なるアーキテクチャ用の複数のライブラリを一度に作成できます。Application.mk次の行をファイルに追加することで、対象とする CPU を具体的に制御できます。

APP_ABI := arch1 arch2 arch3 ...

例えば、

APP_ABI := armeabi armeabi-v7a mips

次に、ビルド プロセスによってさまざまなバージョンのネイティブ ライブラリが作成されます。これらのバージョンは、ディレクトリ内の最終的な apk に配置する必要があります

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

はアーキテクチャの名前です。次に、ライブラリをロードします

System.loadLibrary("<name>");

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

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

于 2013-05-13T10:20:40.107 に答える