Android NDK JNI 开发之旅03 so类库 JAR包
2018-01-01 本文已影响225人
奔跑吧技术人
作者简介
微信公众号(高质量文章推送):走向全栈工程师
作者:陈博易
声明:本文是个人原创,未经允许请勿转载
商业合作请在微信公众号回复:联系方式
![](https://img.haomeiwen.com/i3376017/22a83369e71b9ff2.png)
![](https://img.haomeiwen.com/i3376017/e329dd02b8ec4209.png)
前言
- 为什么要学习JNI呢,我的回答是:因为我好学!哈哈哈。
- 用Jar包的方式加载so类库的方式比较优雅。在使用高德地图开发地图模块时,也是这个套路,导入高德的Jar包和一堆的类库
环境以及工具
- Android项目:AndroidStudio3.0
- NDK
- CMake3.6.4
- LLDB3.0
整体步骤
- 创建so类库的library
- library生成对应的JAR包和so类库
- 使用so类库项目介绍
核心步骤解读
1. 创建so类库的library
![](https://img.haomeiwen.com/i3376017/ad8d14aeb273af71.png)
![](https://img.haomeiwen.com/i3376017/c80fa63f9a1a5f2f.png)
![](https://img.haomeiwen.com/i3376017/35fd6c912a2ba516.png)
将上篇文章的这几个文件复制到library项目相对应目录中,别说你不知道在哪里,那就看我的前面几篇文章,去找找
![](https://img.haomeiwen.com/i3376017/6ee23c3ff2e7906f.png)
jnilibrary/build.gradle代码展示
apply plugin: 'com.android.library'
android {
compileSdkVersion 26
defaultConfig {
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//Gradle 文件配置对CMake的配置
externalNativeBuild {
cmake {
cppFlags ""
}
}
//Gradle 构建并打包某个特定abi体系架构下的.so库
ndk {
// Specifies the ABI configurations of your native
// libraries Gradle should build and package with your APK.
abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a',
'arm64-v8a','mips','mips64'
}
}
//Gradle 文件配置对CMake的配置
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
def JAR_NAME = "JniUtils";//定义jar name
def JAR_VERSION = "_V1.0";//定义jar version
def JARDestinationPath = "build";//定义输出路径
def zipJarFile = file('build/intermediates/bundles/release/classes.jar')//jar包来源
task deleteBuild(type: Delete) {
//删除之前生成的jar包
delete JARDestinationPath + JAR_NAME + JAR_VERSION + ".jar"
}
task makeJar(type: Jar) {
from zipTree(zipJarFile)//jar包来源
from fileTree(dir: 'src/main',includes: ['assets/**'])//assets文件的内容打包到jar包里
baseName = JAR_NAME + JAR_VERSION//jar包输出名称
destinationDir = file(JARDestinationPath)//jar包输出路径
}
makeJar.dependsOn(deleteBuild, build)
2. 生成对应的JAR包和so类库
jnilibrary/build.gradle的task不能忽视了,重要的事情说三遍。。。
![](https://img.haomeiwen.com/i3376017/828a7e73f461062b.png)
![](https://img.haomeiwen.com/i3376017/fbfd6455a6cee8b3.png)
生成JAR方式一:双击makeJar
![](https://img.haomeiwen.com/i3376017/b3b455c1ae16441c.png)
生成JAR方式二:在terminal 终端下输入gradlew makeJar命令
![](https://img.haomeiwen.com/i3376017/6549685ad047e7f3.png)
编译完成后会提示
![](https://img.haomeiwen.com/i3376017/0149eeae0922a181.png)
最终生成JAR 包和 so类库
![](https://img.haomeiwen.com/i3376017/126835faf843708a.png)
3. 使用so类库项目介绍
将类库中的JAR包和so复制代主项目的libs目录下
![](https://img.haomeiwen.com/i3376017/fdcc0fe768aba939.png)
app/build.gradle展示
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
}
buildTypes {
}
sourceSets {
main {
//加载对应类库:如果是将so放在app/libs则
//需要jniLibs.srcDirs = ['libs'],如果是将so放在
// app/src/main/jniLibs,则需要jniLibs.srcDirs = ['jniLibs']
// 也可以删除,因为AndroidStudio中新建项目时,系统默认为我们配置好了
// gradle,所以系统默认就会到这个目录下找so包
jniLibs.srcDirs = ['libs']
}
}
}
dependencies {
}
使用就是这么简单
![](https://img.haomeiwen.com/i3376017/7fae26dea4d441ca.png)
总结
- 请大家多关注关注我。
- 接下来继续深入ndk jni这一块的知识以及基本的c c++基本知识,希望大家多多支持
Android NDK JNI 开发 环境搭建入门篇
Android NDK JNI 开发之旅 so类库 简单使用篇
个人相关教程
各种大佬推荐的编程视频资源分享
Android 微信 支付宝支付,2行代码实现支付
Android前端 Java后端 集成支付宝支付
postman使用 Android java后端 接口调试工具
Android抓包 Charles http接口调试
消息推送 Android java后端集成小米推送
如何导入简单的java项目-IntelliJ IDEA
请关注我(高质量文章推送)
源码地址———关注微信公众号,回复:ndk类库使用02
![](https://img.haomeiwen.com/i3376017/984d23bad2d5a87d.jpg)