序文
「Java 仮想マシンの徹底理解」という本を読んでいるときに、Java 仮想マシンのランタイム データ領域にネイティブ メソッド スタック (Native Method Stack) という概念があることに気づきました。ネイティブ メソッドであり、ネイティブによって変更されます。 このメソッドは Java 言語によって実装されません。C/C++ によって実装され、JNI (Java Native Interface) を通じて呼び出すことができます。もちろん、Java メソッドを提供する Java 仮想マシン スタックもあります。この記事は主に、ネイティブ メソッドを呼び出す方法を理解することを目的としています。
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();
}
}
-
コンパイルしてMain.class ファイルを生成し
javac Main.java
、それを実行してjavah Main
Main.h ファイルを生成します。目的は、指定されたクラスのネイティブ メソッドの .h ファイルを生成することです。 -
Visual Studio 2022 を使用して C++ プロジェクト テストを作成します。生成された DLL の名前は、上記の Java コードにロードされたクラス ライブラリの名前と一致している必要があります。
-
図に示すように、上記で生成された Main.h と、%JAVA_HOME/include/jni.h% および %JAVA_HOME/include/win32/jni_md.h% の 3 つのファイルをテスト ディレクトリにコピーします。
-
上記3つのファイルをヘッダーファイルに追加します。
-
Main.h の
#include <jni.h>
変更を次のように変更します。#include "jni.h"
-
C++ ソース ファイル Hello.cpp を追加し、次のコンテンツを追加します。
#include "pch.h"
#include <iostream>
#include "Main.h"
using namespace std;
JNIEXPORT void JNICALL Java_Main_TestOne
(JNIEnv*, jclass)
{
cout << "hello sherman" << endl;
}
-
プロジェクトをビルドし、test.dll を E:\ にコピーします (ここでは 64 ビットです)
- Java プログラムを直接実行して、出力「hello sherman」を確認します。
著者:sherman168
リンク:https://www.jianshu.com/p/21f7ebb9e63f
出典:Jianshu
著作権は著者に帰属します。商業的転載の場合は著者に連絡して承認を求め、非商業的転載の場合は出典を明記してください。