Java Native Interface调用其它编程语言的代码

今天在看java源码的时候,看到了修饰方法的native字段,由于之前没有使用过,所以就在搜索引擎上搜索了一下。native关键字其实对应的是JNI(Java Native Interface,java原生接口的缩写)。


JNI解释.png

上述内容描述的是,native关键字应用于方法来指示此方法由原生代码使用JNI来实现。native是一个方法修饰符,我们不能用于除此之外的任何地方。这些有C,C++实现的方法被称作原生方法或外来方法。
native关键字的主要目标是:

  • 用来提高系统性能
  • 用来达成机器/内存级别交流
  • 用来使用已经存在的遗留非java代码
    下面来实现一个在java中调用C++代码的一个demo
  1. 创建native方法
public class NativeMain {
    public native static void helloCPP();
}
  1. 使用javac -d . NativeMain.java命令会生成一个NativeMain.class
  2. 使用命令javah -jni nativeDemo.NativeMain,此时会在当前文件下产生一个NativeMain.h文件
  3. 打开visual studio创建一个空的c++空项目,之后将NativeMain.h复制到项目下


    image.png

    回到vs中,点击显示所有文件,下面标红的按钮:


    image.png

    右键选中该文件,点击包括在项目中。取消显示所有文件,头文件就自动包含在了头文件文件夹里了。如果不是自动包含在头文件里面,也可以右键选中头文件夹,选择添加,选择现有项手动添加进来。
    image.png

    包含进来后,你会发现,里面是有错误的,这是因为缺少jni.h头文件。选择项目,右键=》属性。然后选择VC++ 目录,选择包含目录。


    image.png

    点击向下按钮,点击编辑,把jdk的两个目录win32和include包含进来。右键选择源文件,添加=》新建项,选择C++文件,命名为NativeMethod,点击添加:
#include 

#include "NativeMain.h"

#include

#include

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改为未设置。


image.png

右键选择项目,选择属性,把配置类型修改为动态库,然后右键选择项目,生成,就在当前项目目录的debug目录下自动生成了dll文件。

  1. 将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();
    }
}
  1. 结果


    调用结果

参考文章:https://www.it610.com/article/1280270677626077184.htm

你可能感兴趣的:(Java Native Interface调用其它编程语言的代码)