3

私は非常に処理集約的なアプリを持っているので、 NEON / Advanced SIMDをサポートするバリアントを構築したいと考えています。また、アルゴリズムを含む複数のソース ファイルがあるため、ファイルごとに個別にネオンを有効にしたくありません。の重要な部分に続いてAndroid.mk:

ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)

include $(CLEAR_VARS)
# Build Advanced SIMD variant
LOCAL_MODULE            := mymod-neon
LOCAL_ARM_NEON          := true
LOCAL_ARM_MODE          := $(MY_ARM_MODE)
LOCAL_SRC_FILES         := $(MY_SRC_FILES)
LOCAL_C_INCLUDES        := $(MY_C_INCLUDES)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
LOCAL_SHARED_LIBRARIES  := $(MY_SHARED_LIBRARIES)
include $(BUILD_SHARED_LIBRARY)

endif

include $(CLEAR_VARS)
# Build regular variant
LOCAL_MODULE            := mymod
LOCAL_ARM_MODE          := $(MY_ARM_MODE)
LOCAL_SRC_FILES         := $(MY_SRC_FILES)
LOCAL_C_INCLUDES        := $(MY_C_INCLUDES)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
LOCAL_SHARED_LIBRARIES  := $(MY_SHARED_LIBRARIES)
include $(BUILD_SHARED_LIBRARY)

ARMv7a用に 2 つのライブラリをビルドしようとしましたが、残念ながら「高度な」Makefile ツールを使用しているため、2 つの異なるライブラリをコンパイルしているとは言えません。

.oターゲットをオーバーライドします。

/android-ndk/build/core/build-binary.mk:272: warning: overriding commands for target `obj/local/armeabi-v7a/objs/myalg.o'

悲しいことに、ネオン オブジェクトを のobjs-neon代わりに強制的に組み込む方法を見つけられませんでしobjた。

エレガントな問題でこれを解決できる方法はありますか?

4

2 に答える 2

1

私が最終的にやったのは、ディレクトリにシンボリックリンクを作成し、src次をsrc-neon介してすべてのネオンソースにアクセスすることでしたsrc-neon:

ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)

include $(CLEAR_VARS)
# Build Advanced SIMD variant
LOCAL_MODULE            := mymod-neon
LOCAL_ARM_NEON          := true
LOCAL_ARM_MODE          := $(MY_ARM_MODE)
LOCAL_SRC_FILES         := $(call get_sources,`src-neon`)
LOCAL_C_INCLUDES        := $(MY_C_INCLUDES)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
LOCAL_SHARED_LIBRARIES  := $(MY_SHARED_LIBRARIES)
include $(BUILD_SHARED_LIBRARY)

endif

include $(CLEAR_VARS)
# Build regular variant
LOCAL_MODULE            := mymod
LOCAL_ARM_MODE          := $(MY_ARM_MODE)
LOCAL_SRC_FILES         := $(call get_sources,`src`)
LOCAL_C_INCLUDES        := $(MY_C_INCLUDES)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
LOCAL_SHARED_LIBRARIES  := $(MY_SHARED_LIBRARIES)
include $(BUILD_SHARED_LIBRARY)

幸運なことに、私たちは早い段階で Unix マシンでのみ動作することを決定したので、これは実行可能なオプションです。

于 2013-04-08T06:04:57.300 に答える
0

はい、ndk-build はデバッグと非デバッグおよび ISA によって中間オブジェクトを分離する必要があるため、実際には、他の人が指摘したように、他の場所でエラーが発生している可能性があると思います。ndk-build は中間オブジェクトを ISA とデバッグ/非デバッグで分離しますが、モジュール名では分離しないことに注意してください。したがって、複数のモジュールが同じファイルをビルドしようとすると、問題が発生する可能性があります。

armeabi-v7aそうは言っても、 NEONサポートを意味するものではないため、これについて少し間違った方法で行っている可能性があることを指摘します. ARM は v7a で NEON を導入しましたが、これはベンダーが追加するオプションのコプロセッサであるため、v7a プロセッサには NEON コプロセッサがない場合があります。残念ながら、この情報により、振り出しに戻ってしまいます...

この質問には少し重複があります。

Android ビルド システム、NEON および非 NEON ビルド

さらに、NDK ビルド ドキュメントでは、ページ全体がこれに当てられています。android-ndk-r8e/documentation.html を見てください。左側に「CPU ARM Neon」へのリンクがあります。

彼らが指摘していることの 1 つは、これを行う最善の方法は CPU ディスパッチを使用することですが、追加のファイル拡張子 .neon を使用して、ソース ファイルにネオンと非ネオンのタグを付ける方法も示しています。私見ですが、ビルド システムに関係なく、さまざまな CPU コードをさまざまなソース ファイルに配置することは常に良いことです。これは一種のベスト プラクティスであり、NDK はそれをサポートしています。

結局のところ、あなたは LCID Fire のソリューションにたどり着くようです。わずかに異なるソース ファイルを使用して、さまざまなライブラリをビルドします。実際には、非 v7a 用、neon を使用する v7a 用、neon を使用しない v7a 用の 3 つの異なるライブラリが必要です。

于 2013-05-09T19:39:50.987 に答える