一. 简介
使用场景:JNI代码中使用libcrypro.so库和libssl.so库,Android Studio版本是3.4.2。 Android系统中提供了libcrypro.so和libssl.so,存在/system/lib目录中,但是在NDK中并没有提供使用该库的头文件和库。不过openssl是开源的,能将其代码编译获得libcrypro.so和libssl.so,并且源码中提供头文件,因此在配置好NDK的CMakeLists.txt文件后,便能使用动态库了。另外网上也有很多已经编译好的libcrypro.so和libssl.so,并头文件。本人使用的armeabi-v7a版本的动态库。
二. 操作步骤
在 /src/main/cpp 目录新建 jniLibs 目录,把 so 文件拷入其中,so文件最好从按住手机里面pull出来,不然可能不兼容;在 /src/main/cpp 目录新建 include目录,把*.h文件全部拷入进去,也可以拷入包含头文件的文件夹,在添加头文件后,不显示红色,就表示头文件目录导入有效。 配置CMakeLists.txt文件
include_directories(${CMAKE_SOURCE_DIR}/include/) #添加头文件目录
add_library(crypto
SHARED
IMPORTED)
set_target_properties(crypto
PROPERTIES IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/jniLibs/libcrypto.so
)
add_library(ssl
SHARED
IMPORTED)
set_target_properties(ssl
PROPERTIES IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/jniLibs/libssl.so
)
# ${CMAKE_SOURCE_DIR} 是cpp所在目录,如我的是:E:\Projects\AndroidProjects\ASProject\Application2\app\src\main\cpp,上面路径拼接就是so所在的路径,也可以用绝对路径替代
# 然后,target_link_libraries中填上libXXX.so的XXX
target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
${log-lib} crypto ssl)
在app的build.gradle中做点修改
# 加一句 abiFilters 'armeabi-v7a'
android {
...
defaultConfig {
...
externalNativeBuild {
cmake {
cppFlags ""
abiFilters 'armeabi-v7a'
}
}
}
加上的作用是将原来默认编译成armeabi-v7a、x86、armeabi等多个版本的so申明只编译成armeabi-v7a版本,因为我们只提供了该版本的so,如果不加的话,编译其它版本时,会因为找不到对应的so版本而报错。
三. 总结
涉及到CMakeLists.txt的配置比较麻烦一些,用到include_directories、add_library、set_target_properties、target_link_libraries。以及最后app的build.gradle中在对应位置加abiFilters ‘armeabi-v7a’ 。整个Demo工程链接地址如下:添加链接描述。