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)文章
Spring Boot利用Thymeleaf發(fā)送Email的方法教程
spring Boot默認就是使用thymeleaf模板引擎的,下面這篇文章主要給大家介紹了關(guān)于在Spring Boot中利用Thymeleaf發(fā)送Email的方法教程,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-08-08JavaScript實現(xiàn)鼠標(biāo)移動粒子跟隨效果
這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)鼠標(biāo)移動粒子跟隨效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08Java向kettle8.0傳遞參數(shù)的方式總結(jié)
介紹了如何在Kettle中傳遞參數(shù)到轉(zhuǎn)換和作業(yè)中,包括設(shè)置全局properties、使用TransMeta和JobMeta的parameterValue,以及通過EL表達式獲取參數(shù)值2025-01-01關(guān)于mybatis3中@SelectProvider的使用問題
這篇文章主要介紹了mybatis3中@SelectProvider的使用技巧,@SelectProvide指定一個Class及其方法,并且通過調(diào)用Class上的這個方法來獲得sql語句,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2021-12-12