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静态库

    前言 最近的项目中需要和AI团队对接,对图片的明暗度、模糊程度等进行判断,一开始AI团队说会提供SDK,我想着也就...

  • Android集成OpenCV并减少库大小

    前言 最近完成了Android上使用OpenCV进行图像拼接的功能,通过导入OpenCV的.so或.a库,JNI封...

  • NDK 链接第三方静态库的方法

    将NDK编译的第三方静态拷贝到JNI目录下,在Android.mk中添加如下代码 以openssl静态库(libc...

  • Android Studio使用jni、so库

    Android Studio使用jni、so库 在Android Studio1.1之后,AS就已经支持jni和s...

  • iOS静态库之间互调冲突问题

    研究目的 1. 在其他静态库(B静态库)中导入公共静态库(A静态库),想直接使用公共静态库(A静态库)中的方法和m...

  • 一、JNI基础

    一、JNI开发的步骤; 二、静态库和动态库的区别; 三、JNIEnv 是什么? 四、JNI基本数据类型; 五、常用...

  • 深入理解JNI阅读笔记

    1.JNI库的名字 Android平台基本上都采用"lib模块名_jni.so"命名方式例如: 2.加载JNI库 ...

  • QT中dll的生成及使用

    C++中的库分为三种:静态库、动态库和导入库 1、静态库:     静态库扩展名为.lib,静态链接(即代码会直接...

  • Android的静态导入和动态导入

    静态导入和动态导入,我们可以使用别人已经打好的静态库或者是动态库。 加入静态库 设置一下路径,以当前的cmakel...

  • 集成环信遇到问题

    1. 静态库问题:静态库问题一般为导入重复或者导入不全。其中不包含实时语音的 SDK 需要导入库有: 包含实时语音...

网友评论

本文标题:Android JNI导入.a静态库

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