最近在做项目的时候用到了一个比较老的用Android.mk生成so库的项目,由于是比较老的版本做的并不支持能够在C部分打断点调试,所以就花了点时间研究怎么将Android.mk文件转换成CMakeList.txt文件。
1.在主项目下添加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.在主项目的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后面的表示项目的名称(不用加lib前缀,系统会自动添加),就是add_library方法的第一个参数;
LOCAL_SRC_FILES后面的表示的所要要到的源文件:导入的是add_library的第三个参数,应该把所有的源文件都写进去,用空格隔开,文件的路径应比较完整;
BUILD_SHARED_LIBRARY:表示导入的是add_library的第二个参数:(BUILD_STATIC_LIBRARY表示导入的是静态库,可不写,如果写的话就是(IMPORT);BUILD_SHARED_LIBRARY表示生成的是动态库,SHARED)
其他:
LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(EXPAT_DIR)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/$(EXPAT_DIR)/lib
LOCAL_C_INCLUDES:表示导入头文件
LOCAL_EXPORT_C_INCLUDES:导入其他头文件;
两者转换成CMakeList语法是:link_directories(..)参数为头文件的目录地址,如果有多个用空格分开
LOCAL_CFLAGS := -DHAVE_EXPAT_CONFIG_H
转换为add_definitions(-DHAVE_EXPAT_CONFIG_H) 括号内的内容同LOCAL_CFLAGS后的内容;
LOCAL_LDLIBS := -lz -llog
LOCAL_STATIC_LIBRARIES := expat
两者都是表示关联库文件,上面的是导入ndk内的库,需要通过find_library来先找到库文件;下面的表示关联静态库。可以用target_link_libraries(DeflatingDecompressor-v3 ${log-lib} ${z-lib} expat) 第一个参数要关联的目标库文件,其他的参数问需要关联的参数。