visual studio2022 JNI開發(fā)流程的實現(xiàn)
1 創(chuàng)建java類
使用idea創(chuàng)建一個maven項目,名為jni-demo,并創(chuàng)建一個類JniTest:
package com.example;
public class JniTest {
public native void printExt();
}
整體結(jié)構(gòu)如下:

2 生成JNI頭文件
利用java類生成C頭文件,命令如下,注意要在包的根路徑執(zhí)行,也就是src\main\java目錄下:
javah -classpath . -jni com.example.JniTest
如果文件中有中文,需要指定格式,如格式為UTF-8 需要添加
-encoding UTF-8參數(shù)解析:
-classpath [class]指定類的路徑-jni [類名]需要生成的類名稱,注意不帶.java
執(zhí)行后生成了如下頭文件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創(chuàng)建DLL項目
3.1 選擇模板中(Windows桌面向?qū)В?/h3>

如果沒有這個模板則安裝:

3.2 為項目命名

3.3 選擇應(yīng)用程序類型為動態(tài)鏈接庫

3.4 項目概覽

4 導(dǎo)入需要的頭文件
4.1 導(dǎo)入需要的頭文件
將第二步生成的com_example_JniTest.h文件、JDK目錄的include目錄下有一個jni.h文件、和JDK目錄下的\include\win32下的jni_md.h文件復(fù)制到visual studio2022創(chuàng)建的項目中,如下:

然后在visual studio2022中點擊頭文件->添加->現(xiàn)有項,找到上述三個頭文件,添加即可。
4.2 修改頭文件
找到jni.h文件中#include <jni_md.h>修改為#include "jni_md.h",如下:

找到com_example_JniTest.h文件中#include <jni.h>修改為#include "jni.h"",如下:

5 編寫C++實現(xiàn)
在visual studio2022中點擊源文件->添加->新建項,選擇C++文件,命名為MyJinCpp.cpp,然后在MyJinCpp.cpp編寫如下內(nèi)容:
#pragma execution_character_set("utf-8")//設(shè)置字符編碼,不然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 << "現(xiàn)在你正在調(diào)用c++的實現(xiàn)" << endl;
}
6 生成dll文件
在visual studio2022中右鍵點擊生成,輸出會顯示一個dll的地址,復(fù)制這個地址,接下來java要用:

7 在java中進行測試
修改Main類,如下:
注意:
- 使用
System.load直接加載任意位置的動態(tài)鏈接庫,需要指定全路徑以及擴展名 - 使用
System.loadLibrary加載java.library.path這一jvm變量所指向的路徑中位置的動態(tài)鏈接庫,不需要指定全路徑以及擴展名可以通過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();
}
}
運行結(jié)果:
現(xiàn)在你正在調(diào)用c++的實現(xiàn)
Process finished with exit code 0
到此這篇關(guān)于visual studio2022 JNI開發(fā)流程的實現(xiàn)的文章就介紹到這了,更多相關(guān)visual studio2022 JNI開發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PageHelper插件實現(xiàn)一對多查詢時的分頁問題
這篇文章主要介紹了PageHelper插件實現(xiàn)一對多查詢時的分頁問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
mybatis-plus動態(tài)表名實現(xiàn)方法
本文主要介紹了mybatis-plus動態(tài)表名實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02
智能 AI 代碼生成工具 Cursor 安裝和使用超詳細教程
Cursor.so 是一個集成了 GPT-4 的國內(nèi)直接可以訪問的,優(yōu)秀而強大的免費代碼生成器,可以幫助你快速編寫、編輯和討論代碼,這篇文章主要介紹了智能 AI 代碼生成工具 Cursor 安裝和使用介紹,需要的朋友可以參考下2023-05-05
Springboot @Transactional使用時需注意的幾個問題記錄
本文詳細介紹了Spring Boot中使用`@Transactional`注解進行事務(wù)管理的多個方面,包括事務(wù)的隔離級別(如REPEATABLE_READ)和傳播行為(如REQUIRES_NEW),并指出了在同一個類中調(diào)用事務(wù)方法時可能遇到的問題以及解決方案,感興趣的朋友跟隨小編一起看看吧2025-01-01
Spring Boot中使用Server-Sent Events (SSE) 實
Server-Sent Events (SSE) 是HTML5引入的一種輕量級的服務(wù)器向瀏覽器客戶端單向推送實時數(shù)據(jù)的技術(shù),本文主要介紹了Spring Boot中使用Server-Sent Events (SSE) 實現(xiàn)實時數(shù)據(jù)推送教程,具有一定的參考價值,感興趣的可以了解一下2024-03-03
如何使用@Value和@PropertySource注入外部資源
這篇文章主要介紹了如何使用@Value和@PropertySource注入外部資源的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06

