AndroidStudio最详细JNI教程

AndroidStudio最详细JNI教程

在工作中,开发的项目一直没有用到jni知识,很多情况下都是拿别人的so包来用,jni的流程看了一遍又一遍,但是从来没有自己动手实现过,今天我们就自己动手实现一遍,让知识记得更牢固一些。

二:NDK下载

要实现我们的jni,首先一定要先下载NDK,NDK是什么?我相信很多小伙伴面试的时候一定背这道面试题了吧.如下:

  • NDK是一系列工具的集合
  • NDK提供了一份稳定、功能有限的API头文件声明
  • NDK的发布,使“Java+C”的开发方式终于转正,成为官方支持的开发方式
  • NDK将使Android平台支持C开发的开端

那么我们下载NDK,有两种下载方式:

点击SDK Manger -> SDK Tools -> NDK -> 点击Apply

OK,NDK下载完成

三、NDK配置
  • 我们先创建一个项目,里面只有一个MainActivity
  • 右键项目 -> Open Module -> Android NDK Location -> OK -> 等待编译

我们发现根目录local.properties里面多了NDK路径如下图:

接着我们在根目录gradle.properties下面加上如下图:
android.useDeprecatedNdk=true

注: 3.2的不需要加 android.useDeprecatedNdk=true 和android.useDeprecatedNdk = true
3.2需要在app目录下 创建一个 CMakeLists.txt 文件

在这里插入图片描述


cmake_minimum_required(VERSION 3.6.0) #这个版本号要注意是否正确不然编译出错

add_library(
# 这里是你so的名字。刚才在 JNIUtil里面引用的
             JNITestSample
             SHARED

             # Provides a relative path to your source file(s).
              #这里是刚才 创建的c++ 代码的名字
             src/main/jni/demo_jni_com_myjnidemo_JNIUtil.cpp )

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

target_link_libraries( # Specifies the target library.
# 这里是你so的名字。刚才在 MainActivity里面要引用的 一样。
                       JNITestSample

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

继续我们在module下面的build.gradle下面加上ndk节点如下图:

ndk {
        moduleName "JNISample"
}

注3.2 build.gradle的写法,图中加红圈部分

abiFilters ‘x86’, ‘x86_64’, ‘armeabi’, ‘armeabi-v7a’, ‘arm64-v8a’ 根据你的需要生成不同版本的lib

在这里插入图片描述

四、编写JNI接口
  • 我们创建一个JNIUtil的类,编写一个native方法如下图:

我们Build -> Make Project一下,我们会发现在/JniTestSample/app/build/intermediates/下面多了一个classes文件夹.我们可以打开AS下面的Terminal进入到classes下面的debug文件夹下
注: 但是3.2的路径在/JniTestSample/app/build/intermediates/javac/debug/compileDebugJavaWithJavac下面

如下图:

前面有重点有弯道,请注意
我们在Terminal执行一下javah com.xiaoyuan.jnitestsample.JNIUtil javah是后面是我的包名
你们一替换成自己的包名,执行完这句话以后会有个.h文件生成出来如下图所示:

我们基本已经完成一半了,但是我们发现很多小伙伴执行javah的时候会出现不少内部或者外部命令这样的问题,这样的问题大多数都是由于java环境变量没有配好,如何配置环境变量,需要小伙伴自己百度一下了。

  • 生成.h文件不够,这只是声明了这个方法,我们还需要实现它,我在main文件下新建一个jni文件夹如下图:

新建以后,我们把刚才生成的.h文件移动到你新建的jni文件夹下,紧接着我们创建一个c++类来实现.h里面声明的方法.
我们把.h类纯复制一份,把后缀名改成.cpp。里面实现它的方法,我们在方法里面返回一句话;
如下图:


上面include就是咱们的倒包,我们看他的方法名是有规律的就是java+包名+类名+方法名

接着我们在JNIUtil里面加上

static
{
    System.loadLibrary("JNITestSample");//名字注意,需要跟你的build.gradle ndk节点       下面的名字一样
}

让系统加载我们编译成的so。

最后我们来使用一下,看是否可以编译so. 我们需要在MainActivity来使用一下如下图:



我们运行一下:OK 我们已经顺利的编译出so如下图:



注: 3.2的so文件路径在/JniTestSample/app/build/intermediates/cmake/debug/obj下面

并且我们的手机端已经显示出了我们的“HelloWorld!”:

四、写到这,我们已经完成了jni的最重要的一步,虽然很简单,但是我还希望小伙伴们能自己实现一下,才能加深印象。

五、下载

Demo下载
注:需要把NDK路径改成自己

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值