开始
在Android Studio3.0中使用JNI非常方便, 基本配置可参考官方文档向现有项目添加 C/C++ 代码。但在实际使用中也会碰到一些问题, 在这里记录下。
ABI
ABI全称为Application Binary Interface,其定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库, 目前Android支持的七种不同的CPU架构:ARMv5、ARMv7、x86、MIPS、ARMv8,MIPS64和x86_64,每一种都关联着一个相应的ABI。具体可参考文章Android的.so文件、ABI和CPU的关系和你必须知道的ABI和CPU关系;
1. 在模块级build.gradle文件中使用ndk.abiFilters可指定支持的ABI配置,如:
android {
......
defaultConfig{
......
ndk {
abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
}
}
}
2. 在利用CMake构建脚本中添加库的多个ABI版本时,可使用ANDROID_ABI路径变量,而不必编写多个命令, 例如库在如下目录中的libopencv_java3.so文件,
则在CMakeLists.txt中使用./src/main/cpp/libs/${ANDROID_ABI}/libopencb_java3.so即可。
引用第三方库
例如应用opencv的库, 首先将编译好的so文件(或者a文件)和头文件引入项目,如放在cpp目录下。在CMakeLists.txt中添加:
include_directories(src/main/cpp/include)
添加opencv的头文件路径;第二步将需要的库引入,
add_library(lib_opencv STATIC IMPORTED )
set_target_properties(lib_opencv
PROPERTIES IMPORTED_LOCATION
/src/main/cpp/libs/${ANDROID_ABI}/libopencv_java3.so)
最后使用添加的库:
target_link_libraries(native-lib
android
lib_opencv)
常用的CMake知识点
1. cmakelists.txt文件路径为${CMAKE_SOURCE_DIR};
2. 设置常量,如将库路径命名为LIBS_PATH
set(LIBS_PATH ${CMAKE_SOURCE_DIR}/src/main/cpp/libs/)
3. 添加预定义宏
ADD_DEFINITIONS(-D宏名称 -D宏名称......)
4. 可利用ADD_SUBDIRECTORY添加子项目文件;