JNI(二) - 如何生成so并暴露给第三方使用

如何生成so并暴露给第三方使用

一般情况下我们直接生成一个支持 native 开发的项目, 在java文件中声明native方法在c,c++文件中实现native方法,通过cmake 配置c,c++文件,在java中调用声明的native方法即可

当我们生成so时 ,调用native方法时,方法路径必须与原包名相同,在这种情况下一般我们有几种方式来处理

  1. 通过jar
    • 生成so 后生成jar包 jar中存在声明native函数的 java 类 将so和jar导入到项目中即可
  2. 通过aar
    • 直接生成aar文件,aar中就包含so 和 声明native函数的java类

通过jar的形式

生成so

  • 将cmake配置好名称 和 要编译的c,c++文件

    • cmake_minimum_required(VERSION 3.10.2)
      # 设置项目名字
      project("checkroot")
      #设置输出名字以及指定生成是静态库还是动态库 动态库为shared 静态库为 static 设置要编译的native文件
      add_library( # Sets the name of the library.
              checkroot
      
              # Sets the library as a shared library.
              SHARED
      
              # Provides a relative path to your source file(s).
              native-lib.cpp)
      
      
      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)
      
      
      target_link_libraries( # Specifies the target library.
              checkroot
      
              # Links the target library to the log library
              # included in the NDK.
              ${log-lib})
      
  • native moudlegradle文件中的defaultconfig{}下添加如下代码

    • externalNativeBuild {
                  cmake {
                      cppFlags ""
                      //指定生成的 cpu 类型  不写就是默认全生成
                      abiFilters "arm64-v8a","armeabi-v7a"
                  }
              }
      
  • 在As右侧的Gradle->你的项目-> 你的native module -> Tasks->build->assemble双击执行即可

    • 例 本项目就是Gradle->NativeCheckRoot->nativelib->Tasks->build->assemble
    • 生成的so 就在build/intermediates/cmake

生成jar

  • 我使用的AndroidStudio Arctic Fox

  • 在native module 的 build.gradle中添加如下代码 – 代码级别与android,dependencies 同级别

    • //该task用来打包jar包--- 生成jar包
      task makeJar(type: Copy) {
          delete 'libs/sdk.jar' //删除已经存在的jar包
          from('build/intermediates/aar_main_jar/release/')//从该目录下加载要打包的文件,注意这个目录,不同版本的AndroidStudio不一样,比如在3.0版本是build/intermediates/bundles/release/,要自己看下。
          into('libs/')//jar包的保存目录
          include('classes.jar')//设置过滤,只打包classes文件
          rename('classes.jar', 'libroot.jar')//重命名,libroot.jar 根据需求设置
      }
      
      makeJar.dependsOn(build)
      
    • 执行build即可在nativelib/libs 目录下生成libroot.jar

      • 注意这里的nativelib/libs 不是固定的 只是我的native module刚好叫nativelib 在moudle里我又新建了个目录叫libs而已 这里可以随便配置

其他项目使用

  • 新建一个Android 项目

  • app目录下新建libs文件夹

  • 将生成的对应cpu架构的so文件夹,以及jar包复制到libs目录下

  • app/build.gradle文件中的android{}内添加如下代码 指定jniLibs路径 当然也可以在main内创建jniLibs 文件夹配置也可以

    • sourceSets {
              main {
                  jniLibs.srcDirs = ['libs']
              }
          }
      
  • app/build.gradle文件中的dependencies下添加如下代码 引入jar

    • implementation fileTree(dir: 'libs', include: ['*.jar'])
        
      implementation files('libs/libroot.jar')
      
  • 通过RootUtlis调用即可

    • 这里我在java类 RootUtils中声明了native方法,所以调用也是通过RootUtils
  • 执行完上述操作之后 就可以将so 配合jar 提供给三方使用了

通过aar形式

生成aar

  • 在As右侧的Gradle->你的项目-> 你的native module -> Tasks->build->assemble双击执行即可

    • build/outputs/aar生成的aar 就在这个路径下
    • aar中就包含了so 和 生成的class.jar 所以不用再生成jar
  • 将aar文件复制到上述所说的libs文件夹下

  • app/build.gradle文件中的dependencies下添加如下代码 引入aar 即可使用

    • implementation files('libs/libroot.aar')
      

直接使用该module 也行

  • 在 项目settings.gradle 内 添加 include ':nativelib'

    • nativelib就是module的名字
  • app/build.gradle文件中的dependencies下添加如下代码 引入module即可使用

    • implementation project(path: ':nativelib')
      

由于没配图请结合代码结构查看即可

代码地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值