NDK开发汇总
已经存在的项目,怎样才能改成Cmake的形式集成NDK呢?
一 修改Build.gradle
android {
compileSdkVersion 29
defaultConfig {
...
// 指导我们的 源文件 编译
externalNativeBuild{
// ndkBuild{
//
// // armeabi-v7a
// abiFilters 'armeabi-v7a'
//
// }
cmake{
abiFilters 'armeabi-v7a'
}
}
// 应该打包几种cpu
//比如: 集成了第三方库 ,第三方库中提供了 arm的 提供了 x86的
// 可以在此处 指导 只打包 arm
// 生成出来的apk 就只会包含 arm的
ndk{
abiFilters 'armeabi-v7a'
}
}
externalNativeBuild{
// ndkBuild{
// path "src/main/cpp/Android.mk"
// }
cmake{
path "CMakeLists.txt"
}
}
...
}
二 配置资源
- src路径下新建cmake文件夹,将项目用到的.c /cpp,.a静态库和.so动态库添加进去
- app目录下新建CMakeLists.txt文件
#指定cmake最小支持版本
cmake_minimum_required(VERSION 3.6.0)
# hello-jni 变量名 最终会生成的so名称
# SHARED 动态库 STATIC静态库
add_library(hello-jni SHARED src/main/cmake/native-lib.c)
二 常见语法
- 指定cmake最小支持版本
cmake_minimum_required(VERSION 3.6.0)
- 引入目录下所有的c文件和C++文件
file(GLOB source src/main/cmake/*.c src/main/cmake/*.cpp)
add_library(hello-jni SHARED ${source})
四 静态库引入
注意: 为了对比效果,本文用的.a和.so库是同一个c文件编译而成,集成的时候是或者关系(一、二、四或者一、二、五),实际运用时不同类型(静态和动态)库并行引入
add_library(Test STATIC IMPORTED)
set_target_properties(Test PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/cmake/${ANDROID_ABI}/libTest.a)
target_link_libraries(hello-jni Test)
完整配置
#指定cmake最小支持版本
cmake_minimum_required(VERSION 3.6.0)
# hello-jni 变量名 最终会生成的so名称
# SHARED 动态库 STATIC静态库
add_library(hello-jni SHARED src/main/cmake/native-lib.c)
# IMPORTED 表示我们这一个静态库是以导入的形式添加进来(预编译静态库)
add_library(Test STATIC IMPORTED)
# 设置导入的路径
# 设置目标属性方法
# 设置Test的导入路径属性
# CMAKE_SOURCE_DIR 当前CMakeLists.txt的路径(cmake工具内置的)
#android cmake内置的ANDROID_ABI
message("ANDROID_ABI:${ANDROID_ABI}")
set_target_properties(Test PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/cmake/${ANDROID_ABI}/libTest.a)
# 链接(不能换位置)
# 要生成的目标so在前
# 编译hello-jni模块 需要链接(依赖)Test模块
target_link_libraries(hello-jni Test)
五 动态库引入
#指定cmake最小支持版本
cmake_minimum_required(VERSION 3.6.0)
# hello-jni 变量名 最终会生成的so名称
# SHARED 动态库 STATIC静态库
file(GLOB source src/main/cmake/*.c src/main/cmake/*.cpp)
add_library(hello-jni SHARED ${source})
# 6.0以上会报错
#add_library(Test2 SHARED IMPORTED)
#set_target_properties(Test2 PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libTest.so)
# 和makefile不同cmake有其他方法引入动态库
# C++:CMAKE_CXX_FLAGS
# set方法 定义一个变量
#-L:库的查找路径 libTest.so
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -L${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}")
# 链接(不能换位置)
# 要生成的目标so在前
# 编译hello-jni模块 需要链接(依赖)Test模块(libTest.so)
target_link_libraries(hello-jni Test log)
#find_library(log-lib log)
#message("log-lib:${log-lib}")
#target_link_libraries(hello-jni Test2 ${log-lib})