Native方法
Java Native方法简单来说就是java调用非java代码的接口。Native方法的实现是由非java语言
实现,比如c
,c++
。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在c++
中,你可以用extern "C"
告知c++编译器去调用一个C的函数。
“A native method is a Java method whose implementation is provided by non-java code.”
在定义一个native method时,并不提供实现体,我们以java.lang.Object
为例,其类中有很多native方法,如getClass
,hashCode
:
1 | public class Object { |
JNI
Java很好,使用的人很多、应用极广,但是Java不是完美的。Java的不足体现在运行速度要比传统的C++慢上许多之外,还有Java无法直接访问到操作系统底层如硬件系统,为此Java提供了JNI来实现对于底层的访问。JNI(Java Native Interface),它是Java的SDK一部分,JNI允许Java代码使用以其他语言编写的代码和代码库,本地程序中的函数也可以调用Java层的函数,即JNI实现了Java和本地代码间的双向交互。
native方法用法和特性
标识符native可以与所有其它的java标识符连用,但是abstract除外。
一个native method方法可以返回任何java类型,包括非基本类型,而且同样可以进行异常控制。
native method的存在并不会对其他类调用这些本地方法产生任何影响,实际上调用这些方法的其他类甚至不知道它所调用的是一个本地方法。
如果一个含有本地方法的类被继承,子类会继承这个本地方法并且可以用java语言重写这个方法,同样的如果一个本地方法被fianl标识,它被继承后不能被重写。
本地方法非常有用,因为它有效地扩充了jvm。事实上,我们所写的java代码已经用到了本地方法,在sun的java的并发(多线程)的机制实现中,许多与操作系统的接触点都用到了本地方法,这使得java程序能够超越java运行时的界限。
自己实现Native方法
我使用的是CLion
和idea
做为C++ IDE和java IDE,如果有同学使用的visual studio系列,可以查看参考博客(自己实现一个Native方法的调用)。
- Java代码
1 | package pers.desperado.demo; |
java代码很简单,申明native方法并在main函数中调用,代码块中的代码是Java加载C++的dll,这个路径一定要与第三步中生成的C++ dll路径一致。
- 生产.h文件
通过在Java out目录下(具体目录看下图),调用命令JNI -jni pers.desperado.demo.Demo
,请注意类参数与自己命名的一致。生成后out目录下会多出一个.h文件
- C++文件
CLion通过编写makelist.txt文件来控制程序的输出形式,我们通过如下代码命令生产dll文件
1 | # cmake_minimum_required(VERSION <specify CMake version here>) |
(注意项目名和文件名)
将第二步生成.h文件复制到C项目文件夹下,并且将%JAVA_HOME%/include目录下的“jni.h”和%JAVA_HOME%/include/win32目录下的“jni_md.h”两个文件
也复制过来
修改.h文件中的#include <jni.h>
为#include "jni.h"
(在clion中它会自动报warning,alt+enter即可更改)
编写main.cpp
1 |
|
执行便会生产dll文件。
4.执行java代码
执行后便会在idea命令框中输出Hello
整体代码我已经放到GitHub仓库,可以自行下载尝试。指路