從Android支持JNI開始,越來越多的開發者使用jni開發,我們新建一個native工程時,android studio默認給工程生成了CmakeLists文件和簡單的native-lib.cpp文件,CmakeLists文件下生成動態鏈接庫的核心代碼爲
add_library( # Sets the name of the library. native-lib # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). native-lib.cpp )
target_link_libraries( # Specifies the target library. native-lib # Links the target library to the log library # included in the NDK. ${log-lib} )
有興趣的同學可以新建一個工程看看,因爲只有一個native-lib.cpp文件,所以這樣寫是沒問題的。但是,在實際開發中,我們可能會有幾十上百個.cpp文件,這時候如果還手動對每個文件添加,那是不是會非常繁瑣呢,每次刪除或者增加.cpp文件都要手動修改CmakeLists文件,作爲程序員,完全無法容忍。
所以,接下來我們自己配置,將所有的.cpp,.c文件一起打包成一個so,當然,有需求的可以打包成多個so。不需要每次都修改CmakeLists文件。工程目錄大概如下:
其中native-lib.cpp和CmakeLists.txt爲新建工程時自動生成的文件,我們新建了一個MyLinkList.cpp和對應的頭文件MylinkList.h。
文件中具體的代碼我們暫時不談,本編文章主要講如何編寫Cmake。
話不多說,直接貼出CmakeLists.txt中的內容
爲了簡潔,我將多餘的註釋都刪掉了,上面的註釋已經很詳細了,相信每一步都能看懂。
到這一步,配置就完成了,此時我們來編譯看看是否能生成我們想要的jniSdk-lib.so,
如上圖,點擊gradle->assemble,提示編譯完成後,確實已經生成了我們想要的so,如下圖:
測科,你可能已經注意到,爲甚了生成的是libjniSdk-lib.so,沒錯,android在生成so庫時,會自動加上lib,我們引用相關so庫的時候只需要調用System.loadLibrary("jniSdk-lib")就可以了。
到此,我們就完成了多個.c,.cpp文件編譯成一個so的功能。文章內容比較簡單,希望可以對JNI感興趣的同學帶來一點幫助。
代碼已上傳github,點此獲取。