2

たとえば、「some」という静的ライブラリをビルドしてみましょう。

LibSome Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := some
LOCAL_SRC_FILES := some.c
include $(BUILD_STATIC_LIBRARY)

LibSome Application.mk

APP_MODULES := somelib
APP_OPTIM  := release

そして、LibSome/obj/local/armeabi/libsome.aで lib の armeabi バージョンを取得します。

そのため、lib を mainProject jni フォルダーにドロップして使用する必要があります。

MainProject Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := some
LOCAL_SRC_FILES := libsome.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/some
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := mainProject
LOCAL_SRC_FILES := mainProject.c
LOCAL_STATIC_LIBRARIES := some
include $(BUILD_SHARED_LIBRARY)

しかし、mips、x86、armeabi-v7a などのさまざまな ABI があり、現在の ndk を追加するだけで、サポートされているすべてのバージョンの somelib を取得できます。

APP_ABI:= all 

SomeLib Application.mk に、LibSome/obj/local/armeabi-v7a/libsome.aLibSome/obj/local/x86/libsome.aなどを取得します

主な質問- 異なる ABI について考えて、mainProjectx86、mainProjectMIPS などのサポートされているすべての ABI に対して異なる ABI ビルド ライブラリを使用してプロジェクトを作成する必要がありますか?

二次的な質問は次のとおりです。

armeabi ABI (デフォルト) のプロジェクトをビルドすると、いくつのデバイスが切り取られますか? armeabi-v7a ABI デバイスで armeabi ABI アプリを実行できますか?

ビルド済みライブラリの異なるセットを持つ 1 つのプロジェクトを持つ方法がある場合は? ameabi-v7a の mainProject をビルドすると、armeabi-v7a ライブラリなどを使用するのでしょうか?

4

2 に答える 2

2

わかりました。最初に、アーキテクチャ固有のアセンブリ言語が組み込まれていない標準の C 呼び出しを使用している場合は、安全に使用できますAPP_ABI := all。これにより、gccがすべてのアーキテクチャのライブラリを作成できるようになり、アプリの実行に問題がなくなります。

ただし、最適化された数学のための NEON アーキテクチャ呼び出しや最適化された数学のための Intel x86 SSE3 呼び出しなど、ARM に固有のものを使用している場合は、APP_ABI := all は良い考えではないかもしれません。これにより、非常に理解しにくい実行時エラーが発生する可能性があります。次に、さまざまなアーキテクチャのさまざまなプロジェクトを維持する必要がある場合があります。

二次的な質問になります: 1. 最新のデバイスのほとんどは armeabi-v7a であるため、古いデバイスのみが切り取られます。また、x86 と MIPS の並列デバイスも切り出されます。しかし、Samsung、HTC、Sony などのほとんどの主力製品は ARM を搭載しているため、アプリはかなりの割合で到達可能になります。

今のところ、2番目のものについてはあまり手がかりがありません。

于 2013-02-05T11:13:21.377 に答える
1

すべての ARM デバイスは armeabi を実行します。古くて遅いものは ARMv6 を使用し、armeabi-v7a ライブラリを使用できません。ただし、armeabi と ameabi-v7a 共有ライブラリを 1 つのアプリケーションに混在させることは可能です。これは、2 つのコピーで出荷したくない巨大なネイティブ ライブラリがある場合や、NEON 最適化で大幅に高速化される可能性のあるパフォーマンスのボトルネックとなる特定の関数がある場合に役立ちます。したがって、最終的に、プロジェクト フォルダーには次の構造があります。

libs/
    armeabi/
            libhuge.so
            libslow.so
    armeabi-v7a/
            libfast.so
于 2013-05-29T19:54:05.810 に答える