最近在做項(xiàng)目的時(shí)候用到了一個(gè)比較老的用Android.mk生成so庫的項(xiàng)目,由于是比較老的版本做的并不支持能夠在C部分打斷點(diǎn)調(diào)試,所以就花了點(diǎn)時(shí)間研究怎么將Android.mk文件轉(zhuǎn)換成CMakeList.txt文件。
1.在主項(xiàng)目下添加CMakeList.txt文件,如果沒有模板可參考如下:
cmake_minimum_required(VERSION 3.4.1)
add_library(? native-lib? SHARED? ?src/main/cpp/native-lib.cpp )
find_library( log-lib? ?log )
target_link_libraries( native-lib ${log-lib} )
2.在主項(xiàng)目的build.gradle文件中添加
externalNativeBuild { cmake { path "CMakeLists.txt" }}
defaultConfig {
...
? ? ?externalNativeBuild {
cmake {
cppFlags "-std=c++11 -std=gnu++11"
arguments '-DANDROID_STL=gnustl_static'
}
}
}
3.具體語法:
include $(CLEAR_VARS)
LOCAL_MODULE := DeflatingDecompressor-v3
LOCAL_SRC_FILES := DeflatingDecompressor/DeflatingDecompressor.cpp
LOCAL_LDLIBS := -lz
include $(BUILD_SHARED_LIBRARY)
其中:
LOCAL_MODULE后面的表示項(xiàng)目的名稱(不用加lib前綴,系統(tǒng)會自動添加),就是add_library方法的第一個(gè)參數(shù);
LOCAL_SRC_FILES后面的表示的所要要到的源文件:導(dǎo)入的是add_library的第三個(gè)參數(shù),應(yīng)該把所有的源文件都寫進(jìn)去,用空格隔開,文件的路徑應(yīng)比較完整;
BUILD_SHARED_LIBRARY:表示導(dǎo)入的是add_library的第二個(gè)參數(shù):(BUILD_STATIC_LIBRARY表示導(dǎo)入的是靜態(tài)庫,可不寫,如果寫的話就是(IMPORT);BUILD_SHARED_LIBRARY表示生成的是動態(tài)庫,SHARED)
其他:
LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(EXPAT_DIR)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/$(EXPAT_DIR)/lib
LOCAL_C_INCLUDES:表示導(dǎo)入頭文件
LOCAL_EXPORT_C_INCLUDES:導(dǎo)入其他頭文件;
兩者轉(zhuǎn)換成CMakeList語法是:link_directories(..)參數(shù)為頭文件的目錄地址,如果有多個(gè)用空格分開
LOCAL_CFLAGS := -DHAVE_EXPAT_CONFIG_H
轉(zhuǎn)換為add_definitions(-DHAVE_EXPAT_CONFIG_H) 括號內(nèi)的內(nèi)容同LOCAL_CFLAGS后的內(nèi)容;
LOCAL_LDLIBS := -lz -llog
LOCAL_STATIC_LIBRARIES := expat
兩者都是表示關(guān)聯(lián)庫文件,上面的是導(dǎo)入ndk內(nèi)的庫,需要通過find_library來先找到庫文件;下面的表示關(guān)聯(lián)靜態(tài)庫。可以用target_link_libraries(DeflatingDecompressor-v3 ${log-lib} ${z-lib} expat) 第一個(gè)參數(shù)要關(guān)聯(lián)的目標(biāo)庫文件,其他的參數(shù)問需要關(guān)聯(lián)的參數(shù)。