今天在看java源码的时候,看到了修饰方法的native字段,由于之前没有使用过,所以就在搜索引擎上搜索了一下。native关键字其实对应的是JNI(Java Native Interface,java原生接口的缩写)。
上述内容描述的是,native关键字应用于方法来指示此方法由原生代码使用JNI来实现。native是一个方法修饰符,我们不能用于除此之外的任何地方。这些有C,C++实现的方法被称作原生方法或外来方法。
native关键字的主要目标是:
- 用来提高系统性能
- 用来达成机器/内存级别交流
- 用来使用已经存在的遗留非java代码
下面来实现一个在java中调用C++代码的一个demo
- 创建native方法
public class NativeMain {
public native static void helloCPP();
}
- 使用javac -d . NativeMain.java命令会生成一个NativeMain.class
- 使用命令javah -jni nativeDemo.NativeMain,此时会在当前文件下产生一个NativeMain.h文件
-
打开visual studio创建一个空的c++空项目,之后将NativeMain.h复制到项目下
回到vs中,点击显示所有文件,下面标红的按钮:
右键选中该文件,点击包括在项目中。取消显示所有文件,头文件就自动包含在了头文件文件夹里了。如果不是自动包含在头文件里面,也可以右键选中头文件夹,选择添加,选择现有项手动添加进来。
包含进来后,你会发现,里面是有错误的,这是因为缺少jni.h头文件。选择项目,右键=》属性。然后选择VC++ 目录,选择包含目录。
点击向下按钮,点击编辑,把jdk的两个目录win32和include包含进来。右键选择源文件,添加=》新建项,选择C++文件,命名为NativeMethod,点击添加:
#include <iostream>
#include "NativeMain.h"
#include<windows.h>
#include<cstdio>
using namespace std;
JNIEXPORT void JNICALL Java_NativeMain_helloCPP
(JNIEnv*, jclass)
{
int x;
x = MessageBox(GetForegroundWindow(), "【Java-JNI】", "this message from c++", 1);
这时调用MessageBox()函数可能会出错:不能将参数 2 从"const char [9]"转换为"LPCWSTR",这是Unicode的问题,项目菜单->最后的属性->配置属性->常规->项目默认值->unicode改为未设置。
右键选择项目,选择属性,把配置类型修改为动态库,然后右键选择项目,生成,就在当前项目目录的debug目录下自动生成了dll文件。
- 将dll复制到E盘,调用native方法
public class NativeMain {
static {
System.load("E:" + File.separator + "Java_Native_Method.dll");
}
public native static void helloCPP();
public static void main(String[] args) {
helloCPP();
}
}
-
结果