中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在java中怎么利用jna調用c#中dll

發布時間:2020-12-04 15:54:59 來源:億速云 閱讀:208 作者:Leah 欄目:編程語言

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

JNA(Java Native Access )提供一組Java工具類用于在運行期動態訪問系統本地庫(native library:如Window的dll)而不需要編寫任何Native/JNI代碼。開發人員只要在一個java接口中描述目標native library的函數與結構,JNA將自動實現Java接口到native function的映射。

優點

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

用過JNI的大神都知道,JNI是一種很變態的設計,JNI需要導入專門為Java生成的頭文件,是一種侵入式的設計,這樣被強行改造的源碼編譯的dll將不能被C#調用

JNA描述

JNA類庫使用一個很小的本地類庫sub 動態的調用本地代碼。程序員只需要使用一個特定的java接口描述一下將要調用的本地代碼的方法的結構和一些基本屬性。這樣就省了為了適配多個平臺而大量的配置和編譯代碼。因為調用的都是JNA提供的公用jar 包中的接口。

一、需求闡述:

如果我們的項目利用c#開發,到了開發后期需要和java組進行合作,其中有一部分業務邏輯利用c#已經code completed,那么我們可能會考慮用java來調用現成的c#dll實現需求。前幾天工作上正好遇到這樣一個問題,于是記下開發過程。

當然這只是個假設,具體情況具體分析,個人認為重構代碼才是王道……

二、原理說明:

其實具體原理我也沒弄太明白,我就根據自己的理解來說吧,拋磚引玉。

因為c#代碼是托管到.net平臺上的,所以java不能直接調用c#代碼,于是引入C++中間件,c++項目可以設置項目為clr公共運行時,從而通過引用的方式調用c#相應方法。而jna是可以直接調用c++生成的dll的,于是大致流程就走通了。c++調用寫好的c#dll,java再調用c++生成的dll中間件,大致流程就是這樣了,不過其中有很多坑,下面我會細說。

三、運行平臺:

  系統:Windows 10 x64

  開發工具:Visual Studio 2015/2017(我筆記本和公司電腦安裝不同版本,我都有實現過) MyEclipse2014

  SDK:jdk-x86、jdk-x64 (dll分為x86和x64平臺,和jdk的版本要對應,同一臺電腦裝兩個版本的jdk比較煩,我采用的是系統配置jdk32位調試32位dll,然后myeclipse自帶64位jdk調試64位dll)

四、準備工作:

  1、首先準備上述運行平臺,建議選擇和系統位數一致的jdk(安裝vs、myeclipse或eclipse或sts);

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

五、開始CODE

5.1 生成c#DLL

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

 在java中怎么利用jna調用c#中dll

  5.1.2 設置c#項目

    首先,右鍵剛剛新建的Invoke項目,點擊屬性。

在java中怎么利用jna調用c#中dll

繼續設置項目屬性。

在java中怎么利用jna調用c#中dll

記得保存。

然后新建需要被調用的CSharp類代碼。這里我們新建一些簡單的方法,為了演示效果我們分別對int、string、bool進行操作。如圖:

在java中怎么利用jna調用c#中dll

然后右鍵項目,點擊生成。

在java中怎么利用jna調用c#中dll

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

5.2 生成c++中間件

  5.2.1 新建c++項目并設置屬性

      在java中怎么利用jna調用c#中dll

在java中怎么利用jna調用c#中dll

在java中怎么利用jna調用c#中dll

項目新建成功,右鍵項目,選擇屬性。

  在java中怎么利用jna調用c#中dll

在java中怎么利用jna調用c#中dll

  5.2.2 書寫c++代碼

添加cpp文件

      在java中怎么利用jna調用c#中dll

      在java中怎么利用jna調用c#中dll

編輯cpp文件        

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

在java中怎么利用jna調用c#中dll

復制下dll生成文件全名,一會兒java里面用。

六、編寫java代碼

6.1 新建java project ,注意選擇和dll平臺一致的jdk。然后將之前下載的兩個jna的jar加載到項目里面,如圖:

在java中怎么利用jna調用c#中dll

6.2 開始寫java 代碼

然后我們運行:

在java中怎么利用jna調用c#中dll

哦豁,報錯了【無效的內存訪問】,因為java找到了c++dll,但是沒找到c#的dll,其中c++dll我們寫的全路徑名,可以直接找到,那么c#的dll怎么找呢。答案是將c#的dll復制到jdk的bin目錄下,jvm就能找到了。

如圖我們將Invoke.dll復制到jdk的bin目錄下:

  在java中怎么利用jna調用c#中dll

然后再運行:

    在java中怎么利用jna調用c#中dll

nice!對于常用類型中的int、string、boolean都可以順利傳遞了,事實上其他類型的也可以實現,只要遵循不同語言之間的類型對應關系就可以了,具體的類型關系可以百度。

七、注意事項

7.1 java報錯:Exception in thread "main" java.lang.Error: Invalid memory access

可能原因:

  1、c#dll沒有復制到jdk的bin目錄;

  2、java和c++之間數據類型不對應;

  7.1.2 java報錯: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時用絕對路徑,這樣你在c++項目編譯過后不用拷貝便可以在java程序里面直接調用;

  2、jdk的平臺和c++項目的平臺不匹配,jdk是32位那么c++dll一定也是32位的,64位也同樣;

  7.1.3 windows64位下編譯的32位dll測試失敗,暫時不清楚是不是64位系統的原因,由于我電腦虛擬機沒有裝上,就沒有去32位系統上測試了。

關于在java中怎么利用jna調用c#中dll就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

孟村| 四会市| 东台市| 樟树市| 慈溪市| 巴林左旗| 丰原市| 庆阳市| 虞城县| 蚌埠市| 广安市| 东港市| 张家界市| 宝坻区| 延津县| 宣威市| 北宁市| 湖北省| 大方县| 涞水县| 商洛市| 紫云| 融水| 科技| 藁城市| 乌审旗| 安塞县| 汉阴县| 电白县| 禹城市| 锦州市| 高雄市| 济源市| 伽师县| 永兴县| 本溪| 乐陵市| 科尔| 沁源县| 桐城市| 孝感市|