且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

JNI之路径初探---1

更新时间:2021-07-13 14:39:59

首先要明白,什么是JNI,我们做安卓开发为什么要学习JNI,学习JNI能干嘛?
JNI全称Java Native Interface (Java本地接口)
那么这个所谓的Java本地接口到底是干什么的呢?


该图是JNI在JVM中所处的位置
该图是JNI在安卓中的运用

众所周知,我们在开发中要新建一个线程需要实现Runnable接口或者继承Thread类,但是我们深究过线程的实现原理吗?当你一步步紧跟源码就会发现Java层根本没有线程的实际实现,它不过是一个Native方法,官方对线程的说明“线程是CPU独立运行和独立调度的基本单位”,几乎不用思考你也知道,Java可能和CPU打交道吗?Java不过是一个层,一个比较高级的壳。
那么JNI在安卓中能干嘛呢,它可以让我们在JAVA层通过调用C、C++代码来进行音视频的处理,蓝牙、WIFI等等非常“底层”的东西去高效率的处理。
那么我们现在新建一个Java项目,不是新建一个安卓项目是因为JNI不等同于NDK,NDK包含了JNI。

Java代码

那么接下来我们cmd在命令行下先生成该类的class文件,再javah 包名+类名,如果报错说类找不到或无法编译,请参考我的另一篇博客http://www.jianshu.com/p/2e36c606d2e3
那么生成了.h头文件,也就是JNI文件,我们来用C或C++语言来实现它

jni02.png
jni03.png
jni04.png
![jni06.png](http://upload-images.jianshu.io/upload_images/3027456-7ebb78fc7e26517a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

本篇博客适合有一些C和C++基础的同学学习,C的项目在VS,代码也非常的简单,这里简单讲一下,为什么有的jni文件参数类型是jobject有的是jclass,jobject是代表当前Native方法类的对象,而jclass代表类的class对象,每一个类都是class类的类对象。最后不要忘了把.dll文件的路径加入到环境变量path中,最后运行,如有疑问,欢迎留言。