logo头像
Snippet 博客主题

从零开始使用Cmake进行jni编程教程(二):打包so和jar包

本文于 1331 天之前发表,文中内容可能已经过时。

前期准备

  1. 确保之前的之前的内容能够正常运行,生成hellow world。如果不行,请点击从零开始使用Cmake进行jni编程教程(一):搭建环境进行环境配置
  2. 确定好jar包的目录结构和so的名称,这两者主要作用有两点。
    1. 在生成so时以规定的名称生成
    2. 在调用native方法时,可以正确找到正确的类
    3. 在编写cpp时可以找到对应java中的类,方便使用对象

      开始工作

  3. 创建新的File-New-New Moudule,创建编译so和jar包的模块

  1. 配置新建Moudule的目录进行配置和build.gradle文件进行编辑:
    1. 去除多余的引用,并编写makejar命令
    2. 将上一个步骤中app下的CMakeLists.txt文件拷贝过来
    3. 并按照之前系统配置的jni默认目录的gradle文件,修改当前模块的gradle内容
    4. 最后的当前项目的gradle配置文件内容为:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      apply plugin: 'com.android.library'

      android {
      compileSdkVersion 27



      defaultConfig {
      minSdkVersion 17
      targetSdkVersion 27
      versionCode 1
      versionName "1.0"
      externalNativeBuild {
      cmake {
      cppFlags "-std=c++11"
      //指定编译的so平台,不指定则编译所有的so平台
      abiFilters "armeabi", "x86"
      }
      }
      }

      buildTypes {
      release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
      }
      }
      externalNativeBuild {
      cmake {
      path "CMakeLists.txt"
      }
      }


      }

      dependencies {
      implementation fileTree(dir: 'libs', include: ['*.jar'])
      }

      // 指定jar的原路径和命名
      def JarName = "coder"
      def JarTargetPath = "build"
      def JarSoureFilePath = file("build/intermediates/packaged-classes/release/classes.jar")


      task maekJar(type: Jar) {
      from zipTree(JarSoureFilePath)
      baseName = JarName
      destinationDir = file(JarTargetPath)
      }

  2. 编写java的native方法,使用上一篇中设置external tools中的javah命令,生成java类对应的.h文件,复制.h文件重命名后缀为cpp,在header中引用之前的.h文件,并实现具体的内容

cpp文件中就返回博主当前的网站吧

编写native方法的java类

生成.h和.cpp文件

实现cpp端的方法

  1. 更新CMakeLists.txt中引用的cpp文件,和对应so的名称

  1. 更改编译模式,从debug改为release,确保class.jar文件能够在正确的路径下生成

buildType方式选取

6. 点击build后就可以生成对应的so了

  1. jar包的生成需要点击使用makeJar命令,如果嫌麻烦也可以自己在build\intermediates\packaged-classes\release目录下,拷贝后重命名即可

使用so和jar包

  1. 新建项目
  2. 把jar包考进lib中,并在gradle中添加引用
  3. 在main目录下把新建jniLibs,把需要引用的平台添加进去
  4. 运行项目

    目录结构

    运行效果