作者简介
微信公众号(高质量文章推送):走向全栈工程师
作者:陈博易
声明:本文是个人原创,未经允许请勿转载
商业合作请在微信公众号回复:联系方式
前言
- 为什么要学习JNI呢,我的回答是:因为我好学!哈哈哈。
- 用Jar包的方式加载so类库的方式比较优雅。在使用高德地图开发地图模块时,也是这个套路,导入高德的Jar包和一堆的类库
环境以及工具
- Android项目:AndroidStudio3.0
- NDK
- CMake3.6.4
- LLDB3.0
整体步骤
- 创建so类库的library
- library生成对应的JAR包和so类库
- 使用so类库项目介绍
核心步骤解读
1. 创建so类库的library
将上篇文章的这几个文件复制到library项目相对应目录中,别说你不知道在哪里,那就看我的前面几篇文章,去找找
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 namedef JAR_VERSION = "_V1.0";//定义jar versiondef 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 {}复制代码
使用就是这么简单
总结
- 请大家多关注关注我。
- 接下来继续深入ndk jni这一块的知识以及基本的c c++基本知识,希望大家多多支持
个人相关教程
请关注我(高质量文章推送)
源码地址———关注微信公众号,回复:ndk类库使用02