题外话
转眼间2019年也已经接近尾声了,回顾这一年也发生了很多事,换工作、搬家、赶项目、学习新技术等等很多事,忙碌的一年,博客也被放下了,真的是越来越懒了,每次都有一万个不写博客的理由,之前每年至少还要更新几篇文章,然而今年一篇文章也没写,趁着这个周末没事情,抓住2019年的小尾巴,把自己一直想写的文章写了,于是就有了今天这篇文章。
jni简介
JNI是Java Native Interface的缩写,它提供了若干的接口实现了Java和其他语言的通信(主要是c、c++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。jni是Android中java和c++之间连接的桥梁,jni是jvm提供的一种与native方法对接的方式。
jni的注册方式分为静态注册和动态注册两种,之前有一篇文章写过jni相关的知识,那篇文章介绍的关于jni的知识就是静态注册的方式,今天主要写的是jni的动态注册。静态注册和动态注册, 两者优缺点如下:
- 静态注册
优点: 理解和使用方式简单, 属于傻瓜式操作, 使用相关工具按流程操作就行, 出错率低
缺点: 当需要更改类名,包名或者方法时, 需要按照之前方法重新生成头文件, 灵活性不高 - 动态注册
优点: 灵活性高, 更改类名,包名或方法时, 只需对更改模块进行少量修改, 效率高
缺点: 对新手来说稍微有点难理解, 同时会由于搞错签名, 方法, 导致注册失败
静态注册
开始jni动态注册之前,可以先来回顾一下静态注册的流程:
- 编写一个java类,在里面加载对应的so库并且通过native关键字定义需要调用的函数
- 在对应路径命令行下输入 javac xxx.java 生成xxx.class文件,然后在src目录下通过 javah xxx.class 生成 com_xxx_xxx.h 头文件
- .将头文件拷贝到jni目录下(eclipse在src同级目录建立文件夹,Android studio 在java同级目录建立文件夹)
-
编写C/C++源代码 并把刚拷贝的头文件包含进去 ,复制头文件中函数的定义部分,并实现其中的你想要的功能,然后编写Android.mk Application.mk(ndk-build编译方式,cmake方式可以不写)
ndk-build编译方式在命令行中进入jni目录,输入ndk-build 即可