Android NDK JNI 开发之旅 开篇

程序IT圈

只提供有用的编程技术,关注即可习得新技能

 

来源:陈博易投稿

https://juejin.im/post/5a4a224bf265da4321546458

声明:本文是个人原创已授权发布,未经允许请勿转载 。

1前言


为什么要学习JNI呢 ?

JNI 全称 Java Native Interface,Java 本地化接口,可以通过 JNI 调用系统提供的 API。JNI是用来实现Java代码与本地的C/C++代码进行交互的。

运行效果图

2环境以及工具


  1. Android项目:AndroidStudio3.0

  2. NDK

  3. CMake3.6.4

  4. LLDB3.0

3整体的步骤

  1. 创建so类库的library

  2. library生成对应的JAR包和so类库

  3. 使用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圈】,让我们一起成长

合适分享 | 值得留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值