阅读 812

Android NDK JNI 开发之旅03 so类库 JAR包使用

作者简介

微信公众号(高质量文章推送):走向全栈工程师

作者:陈博易

声明:本文是个人原创,未经允许请勿转载

商业合作请在微信公众号回复:联系方式


build-->make project结果展示

项目运行结果展示

前言


  1. 为什么要学习JNI呢,我的回答是:因为我好学!哈哈哈。
  2. 用Jar包的方式加载so类库的方式比较优雅。在使用高德地图开发地图模块时,也是这个套路,导入高德的Jar包和一堆的类库

环境以及工具


  1. Android项目:AndroidStudio3.0
  2. NDK
  3. CMake3.6.4
  4. LLDB3.0

整体步骤


  1. 创建so类库的library
  2. library生成对应的JAR包和so类库
  3. 使用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 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 {
}
复制代码

使用就是这么简单

总结


  1. 请大家多关注关注我。
  2. 接下来继续深入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

Android NDK JNI 开发之旅 开源项目

长按二维码“识别”关注或者扫一扫