[转]Java中的native方法

前言

在研读《深入理解Java虚拟机》这本书时,看到Java虚拟机运行时数据区中有关本地方法栈(Native Method Stack)的概念,本地方法栈就是为调用Native方法服务的,被Native修饰的方法不是由Java语言实现的,可以是C/C++实现,然后通过JNI(Java Native Interface)实现调用。当然也有Java虚拟机栈,是为Java方法服务的。本篇主要是想熟悉怎么样去调用Native方法。

通过JNI调用C++方法

  • 通过java代码调用C++的方法

import java.io.File;

public class Main {

    static {
        System.load("E:" + File.separator + "test.dll");
    }

    public native static void TestOne();
    public static void main(String[] args) {
        TestOne();
    }
}
  • 通过javac Main.java编译生成Main.class文件,然后执行javah Main会生成Main.h文件,目的就是为指定的类中的Native方式生成.h文件

  • 通过visual studio 2022创建一个C++的项目test,生成的dll名称需要和上述Java代码中加载的类库名称要一致

[转]Java中的native方法_第1张图片

 

  • 将上面生成的Main.h,以及%JAVA_HOME/include/jni.h%和%JAVA_HOME/include/win32/jni_md.h%,三个文件复制到test目录下,如图所示:

    [转]Java中的native方法_第2张图片

     

  • 将上面三个文件添加到头文件中

 

[转]Java中的native方法_第3张图片

  • 修改一下Main.h中的#include 改成#include "jni.h"

  • 添加C++源文件Hello.cpp并添加如下的内容

#include "pch.h"
#include 
#include "Main.h"
using namespace std;

JNIEXPORT void JNICALL Java_Main_TestOne
(JNIEnv*, jclass)
{
  cout << "hello sherman" << endl;
}
  • 生成项目,复制test.dll,到E:\下(我这里是64位)

[转]Java中的native方法_第4张图片

  • 直接运行java程序可以看到输出结果:"hello sherman"

作者:sherman168
链接:https://www.jianshu.com/p/21f7ebb9e63f
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(java,jvm)