windows下vscode+vs2019開(kāi)發(fā)JNI的示例
JNI全稱是Java Native Interface(Java本地接口)單詞首字母的縮寫(xiě),本地接口就是指用C和C++開(kāi)發(fā)的接口。由于JNI是JVM規(guī)范中的一部份,因此可以將我們寫(xiě)的JNI程序在任何實(shí)現(xiàn)了JNI規(guī)范的Java虛擬機(jī)中運(yùn)行。同時(shí),這個(gè)特性使我們可以復(fù)用以前用C/C++寫(xiě)的大量代碼。
開(kāi)發(fā)JNI程序會(huì)受到系統(tǒng)環(huán)境的限制,因?yàn)橛肅/C++語(yǔ)言寫(xiě)出來(lái)的代碼或模塊,編譯過(guò)程當(dāng)中要依賴當(dāng)前操作系統(tǒng)環(huán)境所提供的一些庫(kù)函數(shù),并和本地庫(kù)鏈接在一起。而且編譯后生成的二進(jìn)制代碼只能在本地操作系統(tǒng)環(huán)境下運(yùn)行,因?yàn)椴煌牟僮飨到y(tǒng)環(huán)境,有自己的本地庫(kù)和CPU指令集,而且各個(gè)平臺(tái)對(duì)標(biāo)準(zhǔn)C/C++的規(guī)范和標(biāo)準(zhǔn)庫(kù)函數(shù)實(shí)現(xiàn)方式也有所區(qū)別。這就造成使用了JNI接口的JAVA程序,不再像以前那樣自由的跨平臺(tái)。如果要實(shí)現(xiàn)跨平臺(tái),就必須將本地代碼在不同的操作系統(tǒng)平臺(tái)下編譯出相應(yīng)的動(dòng)態(tài)庫(kù)。
JNI開(kāi)發(fā)流程主要分為以下4步:
1、在eclipse中編寫(xiě)聲明了native方法的Java類
2、生成JNI頭文件
3、在visual studio 中創(chuàng)建DLL 項(xiàng)目,實(shí)現(xiàn) JNI頭文件中的方法
4、在eclipse中設(shè)置Native library location,路徑為 visual studio 中生成的DLL 文件路徑,運(yùn)行java 程序
通過(guò)上面的介紹,相信大家對(duì)JNI及開(kāi)發(fā)流程有了一個(gè)整體的認(rèn)識(shí),下面通過(guò)一個(gè)示例給大家介紹vscode2019開(kāi)發(fā)JNI,再深入了解JNI開(kāi)發(fā)的各個(gè)環(huán)節(jié)及注意事項(xiàng)。
使用環(huán)境:
- openjdk15
- vscode
- vs 2019
我使用maven默認(rèn)創(chuàng)建項(xiàng)目
將以下代碼復(fù)制進(jìn)App
public class App { static { System.loadLibrary("JNITest"); } public native static void helloJNI(); public static void main( String[] args ) { helloJNI(); } }
接著打開(kāi)debug(Ctrl+Shift+D)
點(diǎn)擊藍(lán)字創(chuàng)建launch.json配置文件
打開(kāi)一個(gè)終端進(jìn)入到與App.java相同路徑
cd .\src\main\java\com\example\
再輸入javac -h .\ App.java
無(wú)警告則成功,此時(shí)路徑如下圖
打開(kāi)vs2019,創(chuàng)建一個(gè)動(dòng)態(tài)鏈接庫(kù)
項(xiàng)目名如下
此時(shí)項(xiàng)目如下圖
然后我們將vscode中生成的com_example_App.h
復(fù)制到該項(xiàng)目目錄下,然后按下Shift+Alt+a
添加該頭文件
可以看見(jiàn)此時(shí)編譯器無(wú)法識(shí)別該頭,所以右鍵單擊項(xiàng)目選擇屬性然后進(jìn)入此界面
右邊小箭頭點(diǎn)擊編輯,此時(shí)出現(xiàn)以下界面
點(diǎn)擊右上角文件夾加號(hào)右邊出現(xiàn)省略號(hào),點(diǎn)擊省略號(hào)然后導(dǎo)航至自己的jdk安裝目錄選擇includ目錄下的所有文件夾,最終成果如下
應(yīng)用保存后可以看見(jiàn)警告已經(jīng)消失,此時(shí)打開(kāi)pch.cpp加入以下代碼并完成函數(shù)
#include "pch.h" #include "com_example_App.h" #include <iostream> JNIEXPORT void JNICALL Java_com_example_App_helloJNI (JNIEnv*, jclass) { std::cout << "hello JNI!" << std::endl; }
此時(shí)將上方debug選擇x64,運(yùn)行項(xiàng)目,運(yùn)行完成后在項(xiàng)目目錄x64/Debug下找到生成的dll文件JNITest.dll
復(fù)制當(dāng)前路徑,打開(kāi)vscode中的launch.json添加如下參數(shù)到configurations下,目錄更改為自己項(xiàng)目下的dll
{"vmArgs": "-Djava.library.path=C:/Users/monoliths/Documents/project/java/JNITest/x64/Debug"}
可以將dll復(fù)制到項(xiàng)目下然后同樣配置java.library.path到dll
也可以直接將dll復(fù)制到System32下或添加到Path中
此時(shí)運(yùn)行java項(xiàng)目可得到以下輸出:
以上就是windows下vscode+vs2019開(kāi)發(fā)JNI的詳細(xì)內(nèi)容,更多關(guān)于vscode2019開(kāi)發(fā)JNI的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java高并發(fā)下CopyOnWriteArrayList替代ArrayList
這篇文章主要為大家介紹了java高并發(fā)下CopyOnWriteArrayList替代ArrayList的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Spring Security認(rèn)證機(jī)制源碼層探究
SpringSecurity是基于Filter實(shí)現(xiàn)認(rèn)證和授權(quán),底層通過(guò)FilterChainProxy代理去調(diào)用各種Filter(Filter鏈),F(xiàn)ilter通過(guò)調(diào)用AuthenticationManager完成認(rèn)證 ,通過(guò)調(diào)用AccessDecisionManager完成授權(quán)2023-03-03SpringBoot2.0 整合 Dubbo框架實(shí)現(xiàn)RPC服務(wù)遠(yuǎn)程調(diào)用方法
這篇文章主要介紹了SpringBoot2.0 整合 Dubbo框架 實(shí)現(xiàn)RPC服務(wù)遠(yuǎn)程調(diào)用 ,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07Java實(shí)現(xiàn)生成pdf并解決表格分割的問(wèn)題
這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)生成pdf,并解決表格分割的問(wèn)題,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11Java實(shí)現(xiàn)瀏覽器大文件上傳的示例詳解
文件上傳是許多項(xiàng)目都有的功能,用戶上傳小文件速度一般都很快,但如果是大文件幾個(gè)g,幾十個(gè)g的時(shí)候,上傳了半天,馬上就要完成的時(shí)候,網(wǎng)絡(luò)波動(dòng)一下,文件又要重新上傳,所以本文給大家介紹了Java實(shí)現(xiàn)瀏覽器大文件上傳的示例,需要的朋友可以參考下2024-07-07springboot?vue項(xiàng)目管理后端實(shí)現(xiàn)接口新增
這篇文章主要為大家介紹了springboot?vue項(xiàng)目管理后端實(shí)現(xiàn)接口新增,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05java實(shí)現(xiàn)隨機(jī)生成驗(yàn)證碼圖片
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)隨機(jī)生成驗(yàn)證碼圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12解析Oracle數(shù)據(jù)庫(kù)中的對(duì)象集合schema
這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)中的對(duì)象集合schema,是Oracle數(shù)據(jù)庫(kù)入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-11-11基于String和List<String>間的相互轉(zhuǎn)換方式
這篇文章主要介紹了基于String和List間的相互轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05