jni使用基礎(三)之Android.mk文件詳解
Android.mk文件詳細說明:
LOCAL_PATH:=$(call my-dir)//調用編譯鏈的函數
LOCAL_PATH是定義源文件在哪個目錄用的.
my-dir 是個定義的宏方法,
$(call my-dir)就是調用這個叫 my-dir的宏方法,這個方法返回值就是Android.mk文件所在的目錄
include $(CLEAR_VARS)//類似工具的初始化操作
CLEAR_BARS 變量是build system裏麵的一個變量
這個變量指向了所有的類似 LOCAL_XXX的變量,
執行完這一句話, 這個編譯係統就把 所有的類似
LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES,...這樣的變量都清除掉
但是不會清除掉 LOCAL_PATH
LOCAL_MODULE 就是你要生成的庫的名字,這個名字要是唯一的.不能有空格.
編譯後係統會自動在前麵加上lib的頭, 比如說我們的Hello 就編譯成了libHello.so
還有個特點就是如果你起名叫libHello 編譯後ndk就不會給你的module名字前加上lib了
但是你最後調用的時候 還是調用Hello這個庫
LOCAL_SRC_FILES = :Hello.c //(當有多個c文件,以“,”分隔開)
這個是指定你要編譯哪些文件
不需要指定頭文件 ,引用哪些依賴, 因為編譯器會自動找到這些依賴 自動編譯
include $(BUILD_SHARED_LIBRARY) //告訴編譯器編譯出來的庫文件是一個動態庫
BUILD_STATIC_LIBRARY //靜態庫編譯參數
.so編譯後生成的庫的類型,
如果是靜態庫.a 配置include $(BUILD_STATIC_LIBRARY)
別的參數
LOCAL_CPP_EXTENSION := cc //指定c++文件的擴展名
LOCAL_MODULE := ndkfoo
LOCAL_SRC_FILES := ndkfoo.cc
LOCAL_LDLIBS += -llog -lvmsagent -lmpnet -lmpxml -lH264Android
//指定需要加載一些別的什麼庫.
動態庫和靜態庫的區別:
動態庫的體積會比較小,是以.so為擴展名
靜態庫的體積比較大,是以.a為擴展名
大小原因:動態庫裏麵隻包含的它運行所依賴的一些環境的配置信息,也就是它在運行的時候,
它會動態的從操作係統中,根據配置信息獲取它運行所需的內容
靜態庫被編譯後,它所有依賴的文件,都加入到編譯後的.a文件中了。
所以,在使用動態庫的時候,如果手機中沒有支持動態庫所需的內容時,就無法使用
so文件,而靜態庫是不需要關心平台問題,它不需要去係統中找相應的引用文件。
最後更新:2017-04-02 17:09:25