欢迎浏览我的博客 获得更多精彩文章
https://boyn.top
JNI教程(一):什么是JNI
通俗来说,JNI(Java Programming interface)就是一个将Java代码和一些本地方法(如C,C++,FORTRAN)连接起来的桥梁.
能够让我们写好的C,C++方法直接用到Java中,同样地,也可以让本地方法调用我们写好的Java方法
JNI是如何起作用的
从Java语言的角度来看,Java通过native方法来调用native代码.这些native方法在Java中只是一个函数,但是是由native的语言来实现,然后编译成Share Library,最后通过JVM加载来进行调用的.在Windows中,Share Library就是我们常见的动态链接库文件(.dll),在Unix系统中,则是(.so)文件.在Java中,只要你声明和实现好了,调用本地方法和调用Java的方法是完全一样的.
但是有一点很重要,Java代码会被编译成不依赖平台的独立的字节码,但是本地方法是平台依赖的,也就是说,我们编译好的dll文件不能够直接用于unix平台,反之亦然.如果你想要Java不丢失其跨平台的特性,那么就要同时把本地方法编译成so和dll文件,供不同的系统来调用.
为什么要用JNI
- 当我们需要用Java语言去实现一些对平台有依赖性的,无法通过Java本身的API来调用时,就要考虑使用JNI了.比如Java并发编程包中,有很多方法都声明为native,因为windows和unix对进程,线程管理的方法是不相同的.
- 你(或者你的同事)遗留下来了一些C,C++代码,你想要重用他,并且不想重构的时候
- 你想要开发一些对运行效率要求高的应用,Java平台的特性没有办法满足你的时候
不要常用JNI
听起来,当我们需要效率或者其他方面的优点的时候,JNI是一个很好用的东西,但是请记住,要把JNI当成你解决问题的最后手段.当你使用JNI的时候,意味着你的项目的技术栈会加深,对在同一个项目组中的其他人来说,技术栈加深,和要阅读一些C,C++代码通常不是那么好的事情,还可能意味着要多加一些会熟练编写native语言的人.同时,在Java项目中用JNI会减少项目的稳定性和可靠性,带来安全风险.
系统要求
为了写JNI代码,你需要一个能够创建shared library的编译器(windows下可以用mingw,linux下可以用g++,clang).同时,你需要安装好JDK