【android】Androidプラットフォーム汎用コンパイルテンプレート

5037 ワード

DATE: 2018.11.13
1、NDKコンパイルC/C++Nativeコードの共通方法
Androidコンパイルディレクトリ関係は、jni/Android_lib.mk jni/Android_app.mk jni/common.mk jni/Application.mk libs:コンパイル後に自動的に作成し、各アーキテクチャプラットフォームstrippedの実行可能ファイルとライブラリobjを格納する:コンパイル後に自動的に作成し、各アーキテクチャプラットフォームnot strippedのターゲットファイル、実行可能ファイルとライブラリを格納する.out:独自に作成したディレクトリで、各アーキテクチャプラットフォームの動静ライブラリと実行可能ファイルを格納します.build_android.py、build_android.sh:コンパイルスクリプトリファレンス:Androidプラットフォーム汎用コンパイル環境
汎用モジュールコンパイルでAndroid_を作成できますlib.mk,Android_app.mkとcommon.MkおよびApplication.mkファイルはndk-buildでコンパイルされます.
テンプレートは次のとおりです:common.mk:ソースファイルディレクトリおよびヘッダファイルディレクトリの設定:LOCAL_の構成C_INCLUDESとLOCAL_SRC_FILES.
##               

SRC_DIR := ../../../src

##     
LOCAL_C_INCLUDES := ./					\
			$(DIR_SRC)			\
			$(DIR_SRC)/../include		\
			$(DIR_SRC)/$(INCLUDEASM)

## C    
C_SRCS := $(DIR_SRC)/test1.c				\
	$(DIR_SRC)/test2.c				\
	$(DIR_SRC)/test3.c				\
	$(DIR_SRC)/test4.c				\
	$(DIR_SRC)/test5.c

##      
A_SRCS := 

ifeq($(PURE_C),0)

#x86  
ifeq($(findstring x86, $(TARGET_ARCH_ABI)), x86)
IFLAGS += -I$(SRC_DIR)/x86
A_SRCS += $(DIR_SRC)/x86/test1.asm			\
	$(DIR_SRC)/x86/test2.asm
endif

#arm  
ifeq($(findstring armeabi, $(TARGET_ARCH_ABI)), armeabi)
IFLAGS += -I$(SRC_DIR)/arm
A_SRCS += $(DIR_SRC)/arm/test1.asm			\
	$(DIR_SRC)/arm/test2.asm
endif

endif

##      
LOCAL_SRC_FILES := $(C_SRCS) $(A_SRCS)


Android_lib.mk:Android.mkファイルは、プロジェクトjni/ディレクトリのサブディレクトリにあり、構築システムにソースファイルと共有ライブラリを記述するために使用されます.実際には,システムを構築して1回または複数回解析する微小GNU makefileフラグメントである.Android.mkファイルはアプリケーションを定義するために使用する.mk、構築システム、および環境変数によって定義されていないプロジェクト範囲設定.
コンパイルパラメータの設定、特定プラットフォームのコンパイルパラメータの設定、動静状態ライブラリのコンパイル構成:LOCAL_の構成PATH,LOCAL_MODULE,LOCAL_CFLAGS,LOCAL_CPPFLAGS.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := libxxx

##     
DEBUG ?= 0
SHARED ?= 1
INCLUDEASM := 


#        
ifeq ($(PURE_C),1)
OPTIM := 1
else
OPTIM := 0
endif

#  GDB    
ifeq ($(DEBUG),1)
GDBEN := -g
else
GDBEN := -O3
endif

#        
CFLAGS := -Wall
CFLAGS += -fPIC
CFLAGS += -std=c99
CFLAGS += $(GDBEN)

#        
ifeq($(TARGET_ARCH_ABI),arm64-v8a)
INCLUDEASM = aarch64
CFLAGS += -march=armv8-a
CFLAGS += -D_REENTRANT
CFLAGS +=        
endif
ifeq($(TARGET_ARCH_ABI),armeabi-v7a)
INCLUDEASM = arm
CFLAGS += -march=armv7-a -mfpu=neon -marm
CFLAGS += -D_REENTRANT
CFLAGS +=        
endif

ifeq($(TARGET_ARCH_ABI),x86_64)
INCLUDEASM = x86
CFLAGS += -march=x86-64 -m64 -msse -msse2 -msse3 -msse4.1
CFLAGS += -D_REENTRANT
CFLAGS +=        
endif

ifeq($(TARGET_ARCH_ABI),x86)
INCLUDEASM = x86
CFLAGS += -march=i686 -m32 -msse -msse2 -msse3 -msse4.1
CFLAGS += -D_REENTRANT
CFLAGS +=        
endif

#      
LOCAL_CFLAGS := $(CFLAGS)
LOCAL_CPPFLAGS := $(CFLAGS)

#include $(LOCAL_PATH)/common.mk

#       、   
ifeq ($(SHARED),1)
include $(BUILD_SHARED_LIBRARY)
else
include $(BUILD_STATIC_LIBRARY)
endif

Android_app.mk:コンパイルパラメータの設定、特定プラットフォームのコンパイルパラメータの設定、コンパイル実行可能ファイルの構成:LOCAL_の構成PATH,LOCAL_MODULE,LOCAL_CFLAGS,LOCAL_CPPFLAGS.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := libxxx

LOCAL_C_INCLUDES :=  	$(LOCAL_PATH)/../../../demo/		\
			$(LOCAL_PATH)/../../../include/


#        
CFLAGS := -Wall
CFLAGS += -fPIC
CFLAGS += -std=c99
CFLAGS += $(GDBEN)

#        
ifeq($(TARGET_ARCH_ABI),arm64-v8a)
INCLUDEASM = aarch64
CFLAGS += -march=armv8-a
endif
ifeq($(TARGET_ARCH_ABI),armeabi-v7a)
INCLUDEASM = arm
CFLAGS += -march=armv7-a -mfpu=neon -marm
endif

ifeq($(TARGET_ARCH_ABI),x86_64)
INCLUDEASM = x86
CFLAGS += -march=x86-64 -m64 -msse -msse2 -msse3 -msse4.1
endif

ifeq($(TARGET_ARCH_ABI),x86)
INCLUDEASM = x86
CFLAGS += -march=i686 -m32 -msse -msse2 -msse3 -msse4.1
endif

#      
LOCAL_CFLAGS := $(CFLAGS)
LOCAL_CPPFLAGS := $(CFLAGS)	
LOCAL_LDFLAGS := $(LOCAL_PATH)/../out/$(TARGET_ARCH_ABI)/libxxx.a
LOCAL_STATIC_LIBRARIES := $(LOCAL_PATH)/../out/$(TARGET_ARCH_ABI)/libxxx.a

#  demo   
SRC_DIR =$(LOCAL_PATH)/../../../demo
DEMO_SRCS := $(SRC_DIR)/demo.c

LOCAL_SRC_FILES := $(DEMO_SRCS)

include $(BUILD_EXECUTABLE) 

Application.mk:APP_の設定ABI,APP_PLATFORMとNDK_TOOLCHAIN_VERSIONなど.
APP_ABI := x86 x86_64 armeabi armeabi-v7a arm64-v8a
APP_PLATFORM := android-9
NDK_TOOLCHAIN_VERSION := 4.9

システムマクロの使い方:APP_ABIのデフォルトでは、NDK構築システムはarmeabi ABIのマシンコードを生成します.このマシンコードは、ARMv 5 TEに基づくソフトウェア浮動小数点演算を用いたCPUに対応する.APP_を使用できますABIは異なるABIを選択します.APP_PLATFORMこの変数には、ターゲットAndroidプラットフォームの名前が含まれます.APP_BUILD_SCRIPTのデフォルトでは、NDK構築システムはjni/でAndroidという名前を検索します.mkのファイル.この動作を書き換える場合は、APP_を定義できます.BUILD_SCRIPTは、代替構築スクリプトを指します.構築システムは常に非絶対パスをNDKトップディレクトリの相対パスとして解釈する.NDK_TOOLCHAIN_VERSIONは、この変数を4.9または4.8として定義し、GCCコンパイラのバージョンを選択します.64ビットABIのデフォルト使用バージョン4.9、32ビットABIのデフォルト使用バージョン4.8.Clangのバージョンを選択するには、この変数をclang 3として定義します.4、clang3.5またはclang.clangがClangの最新バージョンを選択することを指定します
システム変数、マクロ、関数マクロの使用方法については、次の参照してください.https://developer.android.google.cn/ndk/guides/android_mkhttps://developer.android.google.cn/ndk/guides/application_mk
THE END!
転載先:https://www.cnblogs.com/SoaringLee/p/10532274.html