程序IT圈
只提供有用的编程技术,关注即可习得新技能
来源:陈博易投稿
https://juejin.im/post/5a4a224bf265da4321546458
声明:本文是个人原创已授权发布,未经允许请勿转载 。
1前言
为什么要学习JNI呢 ?
JNI 全称 Java Native Interface,Java 本地化接口,可以通过 JNI 调用系统提供的 API。JNI是用来实现Java代码与本地的C/C++代码进行交互的。
运行效果图
2环境以及工具
Android项目:AndroidStudio3.0
NDK
CMake3.6.4
LLDB3.0
3整体的步骤
创建so类库的library
library生成对应的JAR包和so类库
使用so类库项目介绍
4核心步骤解读
1. 创建so类库的library
将上篇文章的这几个文件复制到library项目相对应目录中,别说你不知道在哪里,那就看我的前面几篇文章。之前还有2篇环境篇,环境还没熟悉的可以再去看看 。
https://www.jianshu.com/p/2915034a6938
https://www.jianshu.com/p/b9c631337395
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不能忽视了,重要的事情说三遍。。。
生成JAR方式一:双击makeJar
生成JAR方式二:在terminal 终端下输入gradlew makeJar命令
编译完成后会提示
最终生成JAR 包和 so类库
3. 使用so类库项目介绍
将类库中的JAR包和so复制代主项目的libs目录下
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 {
}
使用就是这么简单
5总结
作者NDK开发开篇,接下来继续深入ndk jni这一块的知识以及基本的c c++基本知识,希望大家多多支持!
开源项目:
https://github.com/cb858504/ndk_jni_learning_demo
源码地址——关注下面微信公众号『走向全栈工程师』,回复:ndk类库使用02
推荐阅读:
关注【程序IT圈】,让我们一起成长
合适分享 | 值得留言