首先,要调用别人的so库和头文件,我们自己项目中需要有NDK。
因为只有C++代码才能直接调用C++代码,也就是头文件和so库的函数。
其次,就是要想办法把头文件,so库和项目中的NDK关联起来,然后作为一个整体,生成一个jni,供Java层调用。
最后,二者的关联是通过CMake完成的。
一.具体讲解一下CMakeLists.txt写法
1.target_include_directories 将头文件与自己项目的ndk关联
注意是add,不是add/
add指的是cpp目录下的add文件夹
#将native-lib 关联到第三方库头文件 下面的路径是第三方头文件的路径
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
add)
2.将第三方so库和自身项目的NDK关联
2.1 add_library将要导入的so库加入到library中,注意每个so库都分开导入
导入第三方库,不同的第三方库需要分开导入,有两个so库需要导入,所以写两次
add_library(testjni SHARED IMPORTED)
add_library(add-lib SHARED IMPORTED)
2.2.set_target_properties告诉CMake so库所在的路径
注意 网上说 ${CMAKE_SOURCE_DIR} 表示源代码的根路径,也就是E:/workas/jnitest/app,这样可以避免硬编码绝对路径。
但是实际打印出来发现#CMAKE_SOURCE_DIR===E:/workas/jnitest/app/src/main/cpp,以至于CMake找不到so库,报错。
具体原因未知,只能先硬编码
#第一个参数为第三方so库名称,第二个指明配置导入第三方so库路径,第三个为第三方库的具体路径
#CMAKE_SOURCE_DIR E:/workas/jnitest/app/src/main/cpp
set_target_properties(
testjni
PROPERTIES IMPORTED_LOCATION
# ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${CMAKE_ANDRO