當前位置:成語大全網 - 書法字典 - android如何編譯so文件

android如何編譯so文件

安卓NDK編譯多個so文件。

Android編譯系統的makefile Android . MK是這樣寫的

(1)Android . MK文件需要指定LOCAL_PATH變量來查找源文件。因為壹般來說,

Android.mk和要編譯的源文件在同壹個目錄下,因此定義如下:

LOCAL_PATH:=$(調用my-dir)

上面的語句意味著LOCAL_PATH變量被定義為成本文件所在的目錄路徑。

(2)Android . MK可以定義多個編譯模塊,每個編譯模塊都以include $(CLEAR _ VARS)開頭。

以include $(BUILD _ XXX)結尾。

包括美元(VARS結算)

編譯系統提供了CLEAR_VARS,它指定GNU MAKEFILE將為您清除除LOCAL_PATH以外的所有LOCAL_XXX變量。

如LOCAL_MODULE、LOCAL_SRC_FILES、LOCAL_SHARED_LIBRARIES、LOCAL_STATIC_LIBRARIES等。

include $(BUILD _ STATIC _ LIBRARY)的意思是編譯成靜態庫。

include $(BUILD _ SHARED _ LIBRARY)的意思是編譯成動態庫。

include $(BUILD _ EXECUTABLE)表示編譯成可執行程序。

(3)示例如下(FrameWorks/base/libs/audioflinger/Android . MK):

LOCAL_PATH:= $(調用my-dir)

包括$(VARS結算)模塊1

ifeq($(AUDIO _ POLICY _ TEST),true)

啟用_音頻_轉儲:= true

endif

LOCAL_SRC_FILES:= \

audio hardware general . CPP \

AudioHardwareStub.cpp \

音頻硬件接口。cpp

ifeq($(ENABLE _ AUDIO _ DUMP),true)

LOCAL _ SRC _ FILES+= audiodump interface . CPP

LOCAL _ CFLAGS+=-den able _ AUDIO _ DUMP

endif

LOCAL_SHARED_LIBRARIES := \

libcutils \

libutils \

libbinder \

libmedia

libhardware_legacy

ifeq($(strip $(BOARD _ USES _ GENERIC _ AUDIO),true)

LOCAL _ CFLAGS+=-DG generic _ AUDIO

endif

LOCAL _ MODULE:= lib audio interface

ifeq($(BOARD _ HAVE _ BLUETOOTH),true)

LOCAL _ SRC _ FILES+= a2dp audio interface . CPP

LOCAL _ SHARED _ LIBRARIES+= liba2dp

LOCAL _ CFLAGS+=-DWITH _ BLUETOOTH-DWITH _ A2DP

LOCAL_C_INCLUDES += $(調用include-path-for,bluez)

endif

include $(BUILD _ STATIC _ LIBRARY)模塊被編譯成壹個靜態庫。

包括$(VARS結算)模塊2

LOCAL_SRC_FILES:= \

AudioPolicyManagerBase.cpp

LOCAL_SHARED_LIBRARIES := \

libcutils \

libutils \

libmedia

ifeq($(目標模擬器),true)

LOCAL_LDLIBS += -ldl

其他

本地共享庫+= libdl

endif

LOCAL _ MODULE:= libaudiopolicybase

ifeq($(BOARD _ HAVE _ BLUETOOTH),true)

LOCAL_CFLAGS += -DWITH_A2DP

endif

ifeq($(AUDIO _ POLICY _ TEST),true)

LOCAL _ CFLAGS+=-d audio _ POLICY _ TEST

endif

include $(BUILD _ STATIC _ LIBRARY)模塊2被編譯為靜態庫。

包括$(VARS結算)模塊3

LOCAL_SRC_FILES:= \

AudioFlinger.cpp \

AudioMixer.cpp.arm \

AudioResampler.cpp.arm \

AudioResamplerSinc.cpp.arm \

audioressamplercubic . CPP . arm \

音頻政策服務。cpp

LOCAL_SHARED_LIBRARIES := \

libcutils \

libutils \

libbinder \

libmedia

libhardware_legacy

ifeq($(strip $(BOARD _ USES _ GENERIC _ AUDIO),true)

LOCAL _ STATIC _ LIBRARIES+= libaudio interface libaudiopolicybase

LOCAL _ CFLAGS+=-DG generic _ AUDIO

其他

LOCAL _ SHARED _ LIBRARIES+= libaudio libaudiopolicy

endif

ifeq($(目標模擬器),true)

LOCAL_LDLIBS += -ldl

其他

本地共享庫+= libdl

endif

LOCAL_MODULE:= libaudioflinger

ifeq($(BOARD _ HAVE _ BLUETOOTH),true)

LOCAL _ CFLAGS+=-DWITH _ BLUETOOTH-DWITH _ A2DP

LOCAL _ SHARED _ LIBRARIES+= liba2dp

endif

ifeq($(AUDIO _ POLICY _ TEST),true)

LOCAL _ CFLAGS+=-d audio _ POLICY _ TEST

endif

ifeq($(目標模擬器),true)

ifeq($(主機操作系統),linux)

LOCAL_LDLIBS += -lrt -lpthread

endif

endif

ifeq($(BOARD _ USE _ LVMX),true)

LOCAL_CFLAGS += -DLVMX

LOCAL_C_INCLUDES +=供應商/恩智浦

LOCAL _ STATIC _ LIBRARIES+= liblifevibes

本地共享庫+= liblvmxservice

# LOCAL _ SHARED _ LIBRARIES+= liblvmxipc

endif

include $(BUILD _ SHARED _ LIBRARY)模塊3被編譯為動態庫。

(4)編寫應用程序(APK)

LOCAL_PATH := $(調用my-dir)

包括美元(VARS結算)

#在java子目錄中構建所有java文件-& gt;直譯(在java子目錄中創建的所有Java文件)

LOCAL_SRC_FILES := $(調用all-subdir-java-files)

#要構建的APK的名稱-& gt;直譯(創造APK的名字)

本地包名稱:=本地包

#告訴它建造壹個APK-& gt;直譯(告訴它建造壹個APK)

包括$(BUILD _ PACKAGE)

(5)編譯依賴於靜態Java庫(static.jar)的應用程序

LOCAL_PATH := $(調用my-dir)

包括美元(VARS結算)

#要包含在包中的靜態庫列表

本地靜態JAVA庫:=靜態庫

#在java子目錄中構建所有java文件

LOCAL_SRC_FILES := $(調用all-subdir-java-files)

#要構建的APK的名稱

本地包名稱:=本地包

#告訴它建造壹個APK

包括$(BUILD _ PACKAGE)

(6)編寫壹個需要平臺密鑰簽名的應用程序。

LOCAL_PATH := $(調用my-dir)

包括美元(VARS結算)

#在java子目錄中構建所有java文件

LOCAL_SRC_FILES := $(調用all-subdir-java-files)

#要構建的APK的名稱

本地包名稱:=本地包

本地證書:=平臺

#告訴它建造壹個APK

包括$(BUILD _ PACKAGE)

(7)編譯需要以特定鍵為前導的應用程序。

LOCAL_PATH := $(調用my-dir)

包括美元(VARS結算)

#在java子目錄中構建所有java文件

LOCAL_SRC_FILES := $(調用all-subdir-java-files)

#要構建的APK的名稱

本地包名稱:=本地包

LOCAL_CERTIFICATE :=供應商/示例/證書/應用程序

#告訴它建造壹個APK

包括$(BUILD _ PACKAGE)

8 .添加預編譯的應用程序。

LOCAL_PATH := $(調用my-dir)

包括美元(VARS結算)

#模塊名稱應該與要安裝的apk名稱匹配。

LOCAL_MODULE := LocalModuleName

LOCAL _ SRC _ FILES:= $(LOCAL _ MODULE)。apk

LOCAL_MODULE_CLASS := APPS

LOCAL _ MODULE _ SUFFIX:= $(COMMON _ ANDROID _ PACKAGE _ SUFFIX)

包括$(BUILD _ prebuild)

(9)添加壹個靜態JAVA庫

LOCAL_PATH := $(調用my-dir)

包括美元(VARS結算)

#在java子目錄中構建所有java文件

LOCAL_SRC_FILES := $(調用all-subdir-java-files)

#此庫依賴的任何庫

LOCAL _ JAVA _ LIBRARIES:= Android . test . runner

#要創建的jar文件的名稱

本地模塊:=樣本

#構建壹個靜態jar文件。

包含$(BUILD _ STATIC _ JAVA _ LIBRARY)

(10)Android . MK的編譯模塊可以定義相關的編譯內容,即指定如下相關變量:

當地AAPT旗幟

LOCAL _ ACP _不可用

本地_附加_ JAVA _目錄

AIDL當地包括

本地_允許_未定義_符號

本地ARM模式

LOCAL_ASFLAGS

本地資產目錄

LOCAL_ASSET_FILES該變量在編譯Android.mk文件中的應用程序(BUILD_PACKAGE)時設置,表示資源文件。

它通常被定義為local _ asset _ files+= $(調用find-subdir-assets)。

本地構建模塊主幹

LOCAL _ C _ INCLUDES額外的C/C++編譯頭文件路徑,LOCAL_PATH表示該文件所在的目錄。

例子如下:

LOCAL _ C _ INCLUDES+= extlibs/zlib-1 . 2 . 3

LOCAL _ C _ INCLUDES+= $(LOCAL _ PATH)/src

LOCAL_CC指定c編譯器。

本地證書簽名認證

LOCAL_CFLAGS為C/C++編譯器定義了附加標誌(如宏定義),例如:local _ cflags+=-DLIB實用程序_本機= 1。

LOCAL_CLASSPATH

本地_壓縮_模塊_符號

必須同時為安裝應用程序時需要復制的頭文件定義LOCAL_COPY_HEADERS_TO。

安裝應用程序時復制頭文件的目標路徑。

LOCAL_cpp_EXTENSION如果您的C++文件不使用cpp作為文件後綴,則可以通過LOCAL_CPP_EXTENSION指定C++文件的後綴。

例如:LOCAL_CPP_EXTENSION :=。復寫的副本

註意,統壹模塊中C++文件的後綴必須壹致。

LOCAL_CPPFLAGS將額外的標誌傳遞給C++編譯器,例如:LOCAL _ CPP flags+=-ff riend-injection。

LOCAL_CXX指定C++編譯器。

本地_ DX _標誌

本地導出包資源

LOCAL_FORCE_STATIC_EXECUTABLE如果編譯後的可執行程序要進行靜態鏈接(執行時不依賴於任何動態庫),請設置LOCAL _ FORCE _ STATIC _ EXECUTABLE:= true。

目前只有libc具有靜態庫的形式,它僅由文件系統中/sbin目錄下的應用程序使用。該目錄中的應用程序通常

文件系統的其余部分尚未加載,因此它必須是靜態鏈接的。

本地生成的來源

本地工具用於

包名的本地工具

本地_中間_來源

本地_中間_目標

本地主機模塊

本地JAR清單

LOCAL_JARJAR_RULES

LOCAL_java_LIBRARIES指定編譯JAVA應用程序和庫時要包含的JAVA類庫。目前有核心和框架兩種類型。

在大多數情況下,它被定義為:local _ Java _ libraries:= core framework。

請註意,LOCAL_JAVA_LIBRARIES不是必需的,在編譯APK時不允許定義它(它將自動添加)。

本地JAVA資源DIRS

本地JAVA資源文件

本地_ JNI _共享_圖書館

LOCAL_LDFLAGS將額外的參數傳遞給連接器(壹定要註意參數的順序)。

LOCAL_LDLIBS指定用於編譯可執行程序或庫的附加庫,並以“-lxxx”格式指定庫,例如:

LOCAL _ LDLIBS+=-lcurses-LP thread

LOCAL_LDLIBS += -Wl,-z,origin

LOCAL_MODULE生成的模塊的名稱(註意應用程序名稱是LOCAL_PACKAGE_NAME而不是LOCAL_MODULE)。

LOCAL_MODULE_PATH生成模塊的路徑。

本地模塊詞幹

本地模塊標簽生成模塊的標記。

本地_無_默認_編譯器_標誌

本地_非_艾瑪_編譯

本地_無_艾瑪_儀器

本地標準圖書館

本地覆蓋包

本地包名APK應用程序的名稱。

本地後處理命令

預編譯包括$(BUILD _ prebuild)或$(BUILD _ HOST _ prebuild)時使用LOCAL _ PREBUILT _ EXECUTABLES,並指定要復制的可執行文件。

本地_預構建_ JAVA _庫

預編譯包括$(BUILD _ prebuild)或$(BUILD _ HOST _ prebuild)時,使用LOCAL _ prebuild _ LIBS來指定要復制的庫。

本地預建OBJ文件

本地預構建靜態JAVA庫

LOCAL_PRELINK_MODULE需要預連接處理嗎(默認情況下是必需的,用於動態庫優化)?

LOCAL_REQUIRED_MODULES指定該模塊所依賴的模塊(該模塊所依賴的模塊將在安裝該模塊時同步安裝)。

本地資源目錄

本地SDK版本

LOCAL_SHARED_LIBRARIES可以鏈接動態庫。

LOCAL_SRC_FILES編譯源文件。

本地靜態JAVA庫

LOCAL_STATIC_LIBRARIES可以鏈接靜態庫。

LOCAL_UNINSTALLABLE_MODULE

本地未條帶化路徑

LOCAL_WHOLE_STATIC_LIBRARIES指定了模塊需要加載的完整靜態庫(這些精通的庫不允許鏈接器在鏈接時刪除無用的代碼)。

LOCAL_YACCFLAGS

覆蓋_構建_模塊_路徑