Android JNI导入.a静态库

作者: 实例波 | 来源:发表于2018-08-09 20:59 被阅读34次

    前言

    最近的项目中需要和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静态库

      本文链接:https://www.haomeiwen.com/subject/ksncbftx.html