Android JNI导入.a静态库

前言

最近的项目中需要和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的配置,这还得多亏公司大佬的指点。
再说一说遇到的一些问题吧:

  1. 不会写映射的代码,C早就忘光了,申请内存,还要释放内存,万幸的是我看到了上面那篇文章,把Java方法中参数和返回值类型写好,一键生成C代码,连申请内存、释放内存都给我写好了,真是太良心。
  2. 关于abiFilters的配置,如果要偷懒,就配置一个通用的:
        ndk {
            abiFilters 'armeabi'
        }

armeabi 可以匹配所有的arm架构的CPU。当然能够每种架构都来一份当然性能最好,但是包体积也会相应增大不少。

  1. 在遇到项目中有多处用到JNI调用时,比如:我现在又导入了一个三方库,里边也有JNI相关的代码,但是abiFilters 配置和我原本的不一样,这就有可能导致报错,我目前的解决办法的在主module里设置统一的配置:
defaultConfig {
        ndk {
            abiFilters 'armeabi'
        }
    }

结尾

差不多就这些了,东西也不多,可是没人指点的话也是磕磕碰碰,总结了一下,以后再遇到就轻车熟路了。
最近刚搞完一个相机、相册相关的需求,收获挺大,这是第一篇,接着写第二篇去。

你可能感兴趣的:(Android JNI导入.a静态库)