目前網上通過JNI方式ndk編譯,mk文件寫法亂七八糟,沒有固定的寫法,讓人看不懂。所以我決定看一下官網是的說明。
直入主題吧:
AnAndroid.mkfile is written to describe your sources to the build system. More specifically:
The file is really a tiny GNU Makefile fragment that will be parsed one or more times by the build system. As such, you should try to minimize the variables you declare there and do not assume that anything is not defined during parsing.
The file syntax is designed to allow you to group your sources into 'modules'. A module is one of the following:
A static library.
A shared library.
A standalone executable.
這個是官網的描述,總結就是Android.mk文件就是用來源碼編譯成android系統識別的庫。
首先看一個簡單例子
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE? ? := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
獲取當前編譯對象的路徑,以下用到的路徑都是基于這個路徑做出的動作,LoCAL_PATH是一個變量,你可以隨便自己取一個名字(阿貓阿狗都行哦),$(call my-dir),這個是真正獲取當前路徑的方法。
include $(CLEAR_VARS)
include $(BUILD_SHARED_LIBRARY)/include $(BUILD_STATIC_LIBRARY)
這一組是成對出現的,前者是開始,后者是結束,其他動作都是在他們之間完成的。
include $(CLEAR_VARS)就是初始化當前環境,在android看來就是初始化GNU環境,具體什么東東就沒有去深究了,只知道他是用來初始化的就足夠了。
include $(BUILD_SHARED_LIBRARY)/include $(BUILD_STATIC_LIBRARY)這個就是指定生成庫的形式,是動態庫還是靜態庫。
好了,框架就是這樣,然后我們就在
include $(CLEAR_VARS)
include $(BUILD_SHARED_LIBRARY)/include $(BUILD_STATIC_LIBRARY)
之間添磚加瓦吧。
LOCAL_MODULE := hello-jni
這個是指定輸入,生成庫的名稱,實際上名稱是前加“lib”,后加“.so”/".a",貌似有點像Linux,反正android就是從Linux來的,我們就不去深究啦,知道怎么回事就行。
LOCAL_SRC_FILES :=hello-jni.c
這個就是指定需要編譯的源碼,寫法有很多種的,自定義文件夾加入等等,這里我不去展開,有時間我會深究一下的。
上述例子沒有加上的:
LOCAL_C_INCLUDES :=$(LOCAL_PATH)/include
這個就是指定需要用到的頭文件的目錄,就在該目錄的include文件夾下,你也可以加上很多其他路徑下的頭文件
LOCAL_LDLIBS := -lz
這個呢,就是連接系統一些庫了,可能我們編譯的時候報的一些錯誤,需要依賴系統的一些庫的。如-lxx,就是連接某一個系統動態庫。
LOCAL_SHARED_LIBRARIES := hello-jni1
這個呢是鏈接我們自己的第三方的動態庫。
LOCAL_STATIC_LIBRARIES 這個一樣,是鏈接我們自己的第三方的靜態庫。
LOCAL_CFLAGS += -Dxxx這個就是你在源碼定義的宏,需要定義的話就在這個參數上加上-Dxxx,前面加"-D",
后面就是宏的名稱了。
好了,今天就簡單的介紹了一下Android.mk文件的基本寫法。有時間我會研究一下鏈接問題,和一些不常用的變量及其用法的。
謝謝大家,由于能力有限,希望大家多多批評指正。