Javaの[転送]ネイティブメソッド

序文

「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 MainMain.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
著作権は著者に帰属します。商業的転載の場合は著者に連絡して承認を求め、非商業的転載の場合は出典を明記してください。

おすすめ

転載: blog.csdn.net/mao_mao37/article/details/129880058