1

armv6とarmv7aのライブラリをロードするAndroidアプリケーションがあります。Samsung SIIでアプリケーションを実行すると、armv6のライブラリが読み込まれます。SamsungSIIにはarmv7ネオンプロセッサが搭載されています。armv7aライブラリをロードする必要があります。私はSamsungSIIIで同じアプリケーションをテストしましたが、armv7aライブラリが読み込まれます。

何か案が?

ありがとうございました。

4

1 に答える 1

1

これは、ここで説明されているSystem.loadLibrary()のバグが原因であると思われます。

要約すると、Ice CreamSandwichのAndroidSDKの一部のバージョンでは、この関数(正しい名前のすべてのライブラリを検索し、正しいアーキテクチャ用にコンパイルされたライブラリを選択することになっています)が台無しになり、間違ったアーキテクチャ。それがここであなたに起こっていることだと思います。

私たちが見つけた解決策は、アーキテクチャに応じてライブラリに異なる名前を付け、選択するライブラリを自分で選択することです。このように、システムは同じ名前の複数のライブラリ間で曖昧さを解消する必要はありません。

このためには、最初に実行しているアーキテクチャを検出する必要があります。これは、NDKに含まれているネイティブコードで実行することも、Javaでcpu-features.h解析することもできます。/proc/cpuinfoデバイスのアーキテクチャを見つけたら、適切なライブラリをロードします。擬似コードでは、次のようになります。

    arch = findArchitecture() // native function 
                              // or  Java function parsing /cpu/info
    switch (arch) {
        case armv7-neon: System.loadLibrary("lib-neon");
        case armv6: System.loadLibrary("lib-armv6");
        ...
    }

お役に立てれば!

于 2013-02-06T12:52:44.060 に答える