文章目錄
- 1 創建java類
- 2 生成JNI頭文件
- 3 使用visual studio2022創建DLL項目
- 3.1 選擇模板中(Windows桌面向導)
- 3.2 為項目命名
- 3.3 選擇應用程序類型為動態鏈接庫
- 3.4 項目概覽
- 4 導入需要的頭文件
- 4.1 導入需要的頭文件
- 4.2 修改頭文件
- 5 編寫C++實現
- 6 生成dll文件
- 7 在java中進行測試
1 創建java類
使用idea創建一個maven項目,名為jni-demo,并創建一個類JniTest
:
package com.example;public class JniTest {public native void printExt();}
整體結構如下:
2 生成JNI頭文件
利用java類生成C頭文件,命令如下,注意要在包的根路徑執行,也就是src\main\java
目錄下:
javah -classpath . -jni com.example.JniTest
-
如果文件中有中文,需要指定格式,如格式為UTF-8 需要添加
-encoding UTF-8
-
參數解析:
-classpath [class]
指定類的路徑
-jni [類名]
需要生成的類名稱,注意不帶.java
執行后生成了如下頭文件com_example_JniTest.h
:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_JniTest */#ifndef _Included_com_example_JniTest
#define _Included_com_example_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/** Class: com_example_JniTest* Method: printExt* Signature: ()V*/
JNIEXPORT void JNICALL Java_com_example_JniTest_printExt(JNIEnv *, jobject);#ifdef __cplusplus
}
#endif
#endif
3 使用visual studio2022創建DLL項目
3.1 選擇模板中(Windows桌面向導)
如果沒有這個模板則安裝:
3.2 為項目命名
3.3 選擇應用程序類型為動態鏈接庫
3.4 項目概覽
4 導入需要的頭文件
4.1 導入需要的頭文件
將第二步生成的com_example_JniTest.h
文件、JDK目錄的include目錄下有一個jni.h
文件、和JDK目錄下的\include\win32下的jni_md.h
文件復制到visual studio2022創建的項目中,如下:
然后在visual studio2022
中點擊頭文件->添加->現有項
,找到上述三個頭文件,添加即可。
4.2 修改頭文件
找到jni.h
文件中#include <jni_md.h>
修改為#include "jni_md.h"
,如下:
找到com_example_JniTest.h
文件中#include <jni.h>
修改為#include "jni.h""
,如下:
5 編寫C++實現
在visual studio2022
中點擊源文件->添加->新建項
,選擇C++文件
,命名為MyJinCpp.cpp
,然后在MyJinCpp.cpp
編寫如下內容:
#pragma execution_character_set("utf-8")//設置字符編碼,不然java中顯示亂碼
#include "com_example_JniTest.h"
#include <iostream>
using namespace std;//引入命名空間std,使得std::cout和std::endl可以直接省去std::JNIEXPORT void JNICALL Java_com_example_JniTest_printExt
(JNIEnv*, jobject) {cout << "現在你正在調用c++的實現" << endl;
}
6 生成dll文件
在visual studio2022
中右鍵點擊生成
,輸出會顯示一個dll
的地址,復制這個地址,接下來java要用:
7 在java中進行測試
修改Main類,如下:
注意:
- 使用
System.load
直接加載任意位置的動態鏈接庫,需要指定全路徑以及擴展名 - 使用
System.loadLibrary
加載java.library.path這一jvm變量所指向的路徑
中位置的動態鏈接庫,不需要指定全路徑以及擴展名可以通過System.getProperty("java.library.path")
方法來獲得該變量的值
package com.example;// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {static {System.load("D:\\ItemProjects\\cpp\\JniProject\\x64\\Debug\\JniProject.dll");}public static void main(String[] args) {new JniTest().printExt();}
}
運行結果:
現在你正在調用c++的實現Process finished with exit code 0