真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

在java中怎么利用jna調(diào)用c#中dll-創(chuàng)新互聯(lián)

這篇文章給大家介紹在java中怎么利用jna調(diào)用c#中dll,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

建網(wǎng)站原本是網(wǎng)站策劃師、網(wǎng)絡(luò)程序員、網(wǎng)頁(yè)設(shè)計(jì)師等,應(yīng)用各種網(wǎng)絡(luò)程序開(kāi)發(fā)技術(shù)和網(wǎng)頁(yè)設(shè)計(jì)技術(shù)配合操作的協(xié)同工作。創(chuàng)新互聯(lián)建站專(zhuān)業(yè)提供成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站制作(企業(yè)站、響應(yīng)式網(wǎng)站開(kāi)發(fā)、電商門(mén)戶網(wǎng)站)等服務(wù),從網(wǎng)站深度策劃、搜索引擎友好度優(yōu)化到用戶體驗(yàn)的提升,我們力求做到極致!

JNA(Java Native Access )提供一組Java工具類(lèi)用于在運(yùn)行期動(dòng)態(tài)訪問(wèn)系統(tǒng)本地庫(kù)(native library:如Window的dll)而不需要編寫(xiě)任何Native/JNI代碼。開(kāi)發(fā)人員只要在一個(gè)java接口中描述目標(biāo)native library的函數(shù)與結(jié)構(gòu),JNA將自動(dòng)實(shí)現(xiàn)Java接口到native function的映射。

優(yōu)點(diǎn)

JNA可以讓你像調(diào)用一般java方法一樣直接調(diào)用本地方法。就和直接執(zhí)行本地方法差不多,而且調(diào)用本地方法還不用額外的其他處理或者配置什么的,也不需要多余的引用或者編碼,使用很方便。 JNA大的好處是避免了重復(fù)造輪子的浪費(fèi)時(shí)間的行為.

用過(guò)JNI的大神都知道,JNI是一種很變態(tài)的設(shè)計(jì),JNI需要導(dǎo)入專(zhuān)門(mén)為Java生成的頭文件,是一種侵入式的設(shè)計(jì),這樣被強(qiáng)行改造的源碼編譯的dll將不能被C#調(diào)用

JNA描述

JNA類(lèi)庫(kù)使用一個(gè)很小的本地類(lèi)庫(kù)sub 動(dòng)態(tài)的調(diào)用本地代碼。程序員只需要使用一個(gè)特定的java接口描述一下將要調(diào)用的本地代碼的方法的結(jié)構(gòu)和一些基本屬性。這樣就省了為了適配多個(gè)平臺(tái)而大量的配置和編譯代碼。因?yàn)檎{(diào)用的都是JNA提供的公用jar 包中的接口。

一、需求闡述:

如果我們的項(xiàng)目利用c#開(kāi)發(fā),到了開(kāi)發(fā)后期需要和java組進(jìn)行合作,其中有一部分業(yè)務(wù)邏輯利用c#已經(jīng)code completed,那么我們可能會(huì)考慮用java來(lái)調(diào)用現(xiàn)成的c#dll實(shí)現(xiàn)需求。前幾天工作上正好遇到這樣一個(gè)問(wèn)題,于是記下開(kāi)發(fā)過(guò)程。

當(dāng)然這只是個(gè)假設(shè),具體情況具體分析,個(gè)人認(rèn)為重構(gòu)代碼才是王道……

二、原理說(shuō)明:

其實(shí)具體原理我也沒(méi)弄太明白,我就根據(jù)自己的理解來(lái)說(shuō)吧,拋磚引玉。

因?yàn)閏#代碼是托管到.net平臺(tái)上的,所以java不能直接調(diào)用c#代碼,于是引入C++中間件,c++項(xiàng)目可以設(shè)置項(xiàng)目為clr公共運(yùn)行時(shí),從而通過(guò)引用的方式調(diào)用c#相應(yīng)方法。而jna是可以直接調(diào)用c++生成的dll的,于是大致流程就走通了。c++調(diào)用寫(xiě)好的c#dll,java再調(diào)用c++生成的dll中間件,大致流程就是這樣了,不過(guò)其中有很多坑,下面我會(huì)細(xì)說(shuō)。

三、運(yùn)行平臺(tái):

  系統(tǒng):Windows 10 x64

  開(kāi)發(fā)工具:Visual Studio 2015/2017(我筆記本和公司電腦安裝不同版本,我都有實(shí)現(xiàn)過(guò)) MyEclipse2014

  SDK:jdk-x86、jdk-x64 (dll分為x86和x64平臺(tái),和jdk的版本要對(duì)應(yīng),同一臺(tái)電腦裝兩個(gè)版本的jdk比較煩,我采用的是系統(tǒng)配置jdk32位調(diào)試32位dll,然后myeclipse自帶64位jdk調(diào)試64位dll)

四、準(zhǔn)備工作:

  1、首先準(zhǔn)備上述運(yùn)行平臺(tái),建議選擇和系統(tǒng)位數(shù)一致的jdk(安裝vs、myeclipse或eclipse或sts);

  2、下載jna.jar :JNA下載  (下載jna-4.4.0.jar 和 jna-platform-4.4.0),也可以 本地下載

五、開(kāi)始CODE

5.1 生成c#DLL

  5.1.1 以管理員方式啟動(dòng)vs(項(xiàng)目涉及到注冊(cè)com組件,必須以管理員啟動(dòng)才能完成),新建c#項(xiàng)目

 在java中怎么利用jna調(diào)用c#中dll

  5.1.2 設(shè)置c#項(xiàng)目

    首先,右鍵剛剛新建的Invoke項(xiàng)目,點(diǎn)擊屬性。

在java中怎么利用jna調(diào)用c#中dll

繼續(xù)設(shè)置項(xiàng)目屬性。

在java中怎么利用jna調(diào)用c#中dll

記得保存。

然后新建需要被調(diào)用的CSharp類(lèi)代碼。這里我們新建一些簡(jiǎn)單的方法,為了演示效果我們分別對(duì)int、string、bool進(jìn)行操作。如圖:

在java中怎么利用jna調(diào)用c#中dll

然后右鍵項(xiàng)目,點(diǎn)擊生成。

在java中怎么利用jna調(diào)用c#中dll

第一步,完成,干得漂亮。

5.2 生成c++中間件

  5.2.1 新建c++項(xiàng)目并設(shè)置屬性

      在java中怎么利用jna調(diào)用c#中dll

在java中怎么利用jna調(diào)用c#中dll

在java中怎么利用jna調(diào)用c#中dll

項(xiàng)目新建成功,右鍵項(xiàng)目,選擇屬性。

  在java中怎么利用jna調(diào)用c#中dll

在java中怎么利用jna調(diào)用c#中dll

  5.2.2 書(shū)寫(xiě)c++代碼

添加cpp文件

      在java中怎么利用jna調(diào)用c#中dll

      在java中怎么利用jna調(diào)用c#中dll

編輯cpp文件        

好了,c++和c#全部工作完成,右鍵生成。

在java中怎么利用jna調(diào)用c#中dll

復(fù)制下dll生成文件全名,一會(huì)兒java里面用。

六、編寫(xiě)java代碼

6.1 新建java project ,注意選擇和dll平臺(tái)一致的jdk。然后將之前下載的兩個(gè)jna的jar加載到項(xiàng)目里面,如圖:

在java中怎么利用jna調(diào)用c#中dll

6.2 開(kāi)始寫(xiě)java 代碼

然后我們運(yùn)行:

在java中怎么利用jna調(diào)用c#中dll

哦豁,報(bào)錯(cuò)了【無(wú)效的內(nèi)存訪問(wèn)】,因?yàn)閖ava找到了c++dll,但是沒(méi)找到c#的dll,其中c++dll我們寫(xiě)的全路徑名,可以直接找到,那么c#的dll怎么找呢。答案是將c#的dll復(fù)制到j(luò)dk的bin目錄下,jvm就能找到了。

如圖我們將Invoke.dll復(fù)制到j(luò)dk的bin目錄下:

  在java中怎么利用jna調(diào)用c#中dll

然后再運(yùn)行:

    在java中怎么利用jna調(diào)用c#中dll

nice!對(duì)于常用類(lèi)型中的int、string、boolean都可以順利傳遞了,事實(shí)上其他類(lèi)型的也可以實(shí)現(xiàn),只要遵循不同語(yǔ)言之間的類(lèi)型對(duì)應(yīng)關(guān)系就可以了,具體的類(lèi)型關(guān)系可以百度。

七、注意事項(xiàng)

7.1 java報(bào)錯(cuò):Exception in thread "main" java.lang.Error: Invalid memory access

可能原因:

  1、c#dll沒(méi)有復(fù)制到j(luò)dk的bin目錄;

  2、java和c++之間數(shù)據(jù)類(lèi)型不對(duì)應(yīng);

  7.1.2 java報(bào)錯(cuò):Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'D:\vs workplace\X86InvokeTest\Release\X86CPPDlls': Native library (win32-x86/D:\vs workplace\X86InvokeTest\Release\X86CPPDlls.dll) not found in resource path ([file:/G:/My%20Eclipse%20workplace/InvokeCSharpX86Test/bin/, file:/G:/My%20Eclipse%20workplace/InvokeCSharpX86Test/Lib/jna-4.4.0.jar, file:/G:/My%20Eclipse%20workplace/InvokeCSharpX86Test/Lib/jna-platform-4.4.0.jar])

可能原因:

  1、c++dll路徑不正確,建議做test時(shí)用絕對(duì)路徑,這樣你在c++項(xiàng)目編譯過(guò)后不用拷貝便可以在java程序里面直接調(diào)用;

  2、jdk的平臺(tái)和c++項(xiàng)目的平臺(tái)不匹配,jdk是32位那么c++dll一定也是32位的,64位也同樣;

  7.1.3 windows64位下編譯的32位dll測(cè)試失敗,暫時(shí)不清楚是不是64位系統(tǒng)的原因,由于我電腦虛擬機(jī)沒(méi)有裝上,就沒(méi)有去32位系統(tǒng)上測(cè)試了。

關(guān)于在java中怎么利用jna調(diào)用c#中dll就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。


文章名稱(chēng):在java中怎么利用jna調(diào)用c#中dll-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://weahome.cn/article/iigpi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部