閱讀362 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go jni使用基礎(八)之jni使用流程及C調用java簡單說明
  下一篇:go ibatis分頁(以mysql為例)