从零开始使用Cmake进行jni编程教程(二):打包so和jar包
本文于 1331 天之前发表,文中内容可能已经过时。
前期准备
- 确保之前的之前的内容能够正常运行,生成hellow world。如果不行,请点击从零开始使用Cmake进行jni编程教程(一):搭建环境进行环境配置
- 确定好jar包的目录结构和so的名称,这两者主要作用有两点。
- 创建新的File-New-New Moudule,创建编译so和jar包的模块
- 配置新建Moudule的目录进行配置和build.gradle文件进行编辑:
- 去除多余的引用,并编写makejar命令
- 将上一个步骤中app下的CMakeLists.txt文件拷贝过来
- 并按照之前系统配置的jni默认目录的gradle文件,修改当前模块的gradle内容
- 最后的当前项目的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
52apply 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)
}
- 编写java的native方法,使用上一篇中设置external tools中的javah命令,生成java类对应的.h文件,复制.h文件重命名后缀为cpp,在header中引用之前的.h文件,并实现具体的内容
cpp文件中就返回博主当前的网站吧
- 更新CMakeLists.txt中引用的cpp文件,和对应so的名称
- 更改编译模式,从debug改为release,确保class.jar文件能够在正确的路径下生成
6. 点击build后就可以生成对应的so了
- jar包的生成需要点击使用makeJar命令,如果嫌麻烦也可以自己在build\intermediates\packaged-classes\release目录下,拷贝后重命名即可