Android Studio NDK中cpp代码链接第三方动态库libcrypro.so

it2024-10-10  21

一. 简介

使用场景: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工程链接地址如下:添加链接描述。

最新回复(0)