AndroidStudio最详细JNI教程
来源:互联网 发布:lambda表达式java 编辑:程序博客网 时间:2024/06/11 16:27
一:概述
在工作中,开发的项目一直没有用到jni知识,很多情况下都是拿别人的so包来用,jni的流程看了一遍又一遍,但是从来没有自己动手实现过,今天我们就自己动手实现一遍,让知识记得更牢固一些。
二:NDK下载
要实现我们的jni,首先一定要先下载NDK,NDK是什么?我相信很多小伙伴面试的时候一定背这道面试题了吧.如下:
- NDK是一系列工具的集合
- NDK提供了一份稳定、功能有限的API头文件声明
- NDK的发布,使“Java+C”的开发方式终于转正,成为官方支持的开发方式
- NDK将使Android平台支持C开发的开端
那么我们下载NDK,有两种下载方式:
- 这是Google官方下载 点击下载NDK;
- 通过SDK Manger下载
点击SDK Manger -> SDK Tools -> NDK -> 点击Apply
OK,NDK下载完成
三、NDK配置
- 我们先创建一个项目,里面只有一个MainActivity
- 右键项目 -> Open Module -> Android NDK Location -> OK -> 等待编译
我们发现根目录local.properties里面多了NDK路径如下图:
接着我们在根目录gradle.properties下面加上如下图: android.useDeprecatedNdk=true
继续我们在module下面的build.gradle下面加上ndk节点如下图:
ndk { moduleName "JNISample" }
四、编写JNI接口
- 我们创建一个
JNIUtil
的类,编写一个native
方法如下图:
我们Build -> Make Project一下,我们会发现在/JniTestSample/app/build/intermediates/
下面多了一个classes
文件夹.我们可以打开AS下面的Terminal
进入到classes
下面的debug
文件夹下
如下图:
前面有重点有弯道,请注意
我们在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如下图:
并且我们的手机端已经显示出了我们的“HelloWorld!”:
四、写到这,我们已经完成了jni的最重要的一步,虽然很简单,但是我还希望小伙伴们能自己实现一下,才能加深印象。
五、下载
Demo下载
注:需要把NDK路径改成自己
五、公众号
- AndroidStudio最详细JNI教程
- AndroidStudio最详细JNI教程
- jni教程(AndroidStudio)
- AndroidStudio JNI详细教程+Gradle3.0 以上 JNI 爬坑之旅
- JNI详细教程
- JNI详细教程
- JNI详细教程
- JNI开发最详细最全入门
- AndroidStudio JNI
- 在AndroidStudio下JNI开发的详细步骤
- 初探JNI技术,HelloWorld 图文详细教程
- Java Native Interface(JNI)从零开始详细教程
- 最详细的黑客教程
- 最详细的批处理教程
- 最详细SQL注入教程
- 最详细SQL注入教程
- 最详细SQL注入教程
- 最详细的黑客教程
- Python 创建、读取和写入文件以及yield关键字- 千月的python linux 系统管理指南学习笔记(14)
- 分享二进制文件读取的编程心得
- 搞 iOS 学算法有意义吗?
- ubuntu安装flash-palyer插件
- 自定义字符串函数:strlen,strcat,strcpy,strcmp
- AndroidStudio最详细JNI教程
- liunx实战应用~redis安装
- 重写原型对象
- dom4j使用方法总结
- python
- 好记性不如烂笔头------使用Acra+Android-Email实现错误日志上传
- openwrt 实现tcp和串口的透传 编译固件设置ser2net
- Android 自定义view绘制折线图
- BFS(带回溯路径) 典例 代码