前言
最近的项目中需要和AI团队对接,对图片的明暗度、模糊程度等进行判断,一开始AI团队说会提供SDK,我想着也就是接一下完事,可谁知道拿到手就一个.a文件,一个.h文件,一脸懵逼。经过自己一番摸索和大佬的帮忙,终于是接进去了,开一篇记录一下。
正文
首先如何使用CMake进行JNI开发,这篇文章有配图,有文字,详细讲解了如何在新工程中加入JNI调用,以及在已有工程上加入JNI调用,写得非常清楚。
其实读完上面的文章,基本操作就没问题了,这里主要讲讲CMakeList.txt文件的配置,以及我在开发过程中遇到的一些问题。
贴一下我的CMakeList文件:
cmake_minimum_required(VERSION 3.4.1)
add_library( # Sets the name of the library.
ImageCheck //生成的so库名称,此处生成的so文件名称是libImageCheck.so
# Sets the library as a shared library.
SHARED //动态库
# Provides a relative path to your source file(s).
src/main/jni/ImageCheck.cpp ) //桥接的cpp文件,这个文件里实现了java类型向C类型的映射
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log ) //加入log 方便调试
add_library( image
STATIC //静态库
IMPORTED )
set_target_properties( # Specifies the target library.
image
# Specifies the parameter you want to define.
PROPERTIES IMPORTED_LOCATION //从本地导入
# Provides the path to the library you want to import.
${CMAKE_CURRENT_SOURCE_DIR}/src/main/jni/image_pro.a ) //.a文件路径
target_link_libraries( # Specifies the target library.
ImageCheck //将 image 库和 log 库一起,链接到 ImageCheck 库中
# Links the target library to the log library
# included in the NDK.
image
${log-lib} )
这样配置之后,我们的.a文件就被链接进了libImageCheck.so库中,这样就和普通的JNI调用一样了。CMakeList中也只是多了一个set_target_properties的配置,这还得多亏公司大佬的指点。
再说一说遇到的一些问题吧:
- 不会写映射的代码,C早就忘光了,申请内存,还要释放内存,万幸的是我看到了上面那篇文章,把Java方法中参数和返回值类型写好,一键生成C代码,连申请内存、释放内存都给我写好了,真是太良心。
- 关于abiFilters的配置,如果要偷懒,就配置一个通用的:
ndk {
abiFilters 'armeabi'
}
armeabi 可以匹配所有的arm架构的CPU。当然能够每种架构都来一份当然性能最好,但是包体积也会相应增大不少。
- 在遇到项目中有多处用到JNI调用时,比如:我现在又导入了一个三方库,里边也有JNI相关的代码,但是abiFilters 配置和我原本的不一样,这就有可能导致报错,我目前的解决办法的在主module里设置统一的配置:
defaultConfig {
ndk {
abiFilters 'armeabi'
}
}
结尾
差不多就这些了,东西也不多,可是没人指点的话也是磕磕碰碰,总结了一下,以后再遇到就轻车熟路了。
最近刚搞完一个相机、相册相关的需求,收获挺大,这是第一篇,接着写第二篇去。
网友评论