日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

利用JNative实现Java调用动态库

發布時間:2024/1/23 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用JNative实现Java调用动态库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
由于項目要求,需要用Java調用windows的dll文件,查了一下,如果用JNI的話是比較麻煩的,在sourceforge.net上搜索了一下 “Java dll”,首先出現的是Jnative,于是決定用它,后來也試了些別的,但還是JNative好使,簡單總結如下:

Java調用動態庫所需要關心的問題:
l???????? 如何裝載dll文件,以及如何定位所要使用的方法;

l???????? 數據類型是如何對應的;

l???????? 如何給使用的方法傳遞參數;

l???????? 如何獲取返回的值。

JNative INFO:
Resource URL: http://jnative.sourceforge.net/

Source Code: http://sourceforge.net/projects/jnative

Detailed Review: http://jnative.free.fr

JavaDOC: http://jnative.free.fr/docs/

Version:1.3

一個開源的組件,通過它調用已有動態庫中的方法就非常的方便,支持CallBack 。

為什么選擇JNative
同類的開源組件相對活躍的還有,JNA ( Java Native Access ), Jawin,Nativecall,etc.但是Jnative 相對更容易使用,它對數據類型的處理做的更好。

l???????? JNA 需要用戶對所使用的DLL文件事先進行封裝,才能裝載。另外需要在一個java接口中描述目標DLL中的函數與結構,從而使JNA自動實現Java接口到native function的映射,較麻煩。

l???????? Nativecall 暫時還不知道如何裝載dll文件。

l???????? Jawin 數據類型匹配相當敏感,它采用一種叫做”instruction string”的格式來傳遞參數,還沒有完全理解。

How to:
解壓JNative-1.3.2.zip 獲得三個文件,分別是:JNativeCpp.dll,libJNativeCpp.so,JNative.jar 。


JNativeCpp.dll Windows下用的,拷到windows / system32目錄下;

libJNativeCpp.so Linux下的咚咚;

JNative.jar 這是一個擴展包,將其copy到C:\jdk\jre\lib\ext 下(我的目錄結構),系統會自動加載。

結構映射(Structure Mapping)

Type
Length
JNative class

DWORD
4
org.xvolks.jnative.misc.basicStructures.LONG

HWND
4
org.xvolks.jnative.misc.basicStructures.HWND

COLORREF
4
org.xvolks.jnative.misc.basicStructures.LONG

COLORREF*
4
org.xvolks.jnative.pointers.Pointer

LPARAM
4
org.xvolks.jnative.misc.basicStructures.LPARAM

LPCCHOOKPROC
4
org.xvolks.jnative.util.Callback

LPCTSTR
4
org.xvolks.jnative.pointers.Pointer


一些關鍵的類及方法

Class
作用
一般用到的方法(參數略,參考Doc)

org.xvolks.jnative.Jnative
裝載dll文件,定位函數
JNative(),setParameter(),setRetVal(),getRetVal() etc.

org.xvolks.jnative.pointers.Pointer
替代本地函數中的的指針,需要先申請一塊內存空間,才能創建
Pointer(),dispose()

org.xvolks.jnative.pointers.memory.MemoryBlockFactory
申請一塊內存空間
createMemoryBlock()

org.xvolks.jnative.exceptions.NativeException
拋出裝載,定位等方面的異常


org.xvolks.jnative.Type
列舉和管理Jnative需要的不同的數據類型




(二)

簡單測試,Javadoc 下和官方網上有些例子,下面的是我隨便從IC讀卡程序中找了個DLL進行的測試:
SCReader.dll 下的SCHelp_HexStringToBytes()函數原型
SCREADER_API WINAPI long SCHelp_HexStringToBytes(

LPCTSTR pSrc,

BYTE* pTar,

int MaxCount

);

注意:dll文件需要放到System32下,否則可能找不到

通過Jnative 用java 來調用代碼如下:

package onlyfun.dllcall; import org.xvolks.jnative.JNative; import org.xvolks.jnative.exceptions.NativeException; import org.xvolks.jnative.pointers.Pointer; import org.xvolks.jnative.pointers.memory.MemoryBlockFactory; import org.xvolks.jnative.Type; public class UserCall { /** * return 轉換成功的字節數 */ static JNative Something = null; static Pointer pointer; public String getSomething(String pSrc, Pointer pTar, int MaxCount) throws NativeException, IllegalAccessException{ try{ if(Something == null){ pTar = new Pointer(MemoryBlockFactory.createMemoryBlock(36)); Something = new JNative("SCReader.DLL", "SCHelp_HexStringToBytes"); // 利用org.xvolks.jnative.JNative 來裝載 SCReader.dll,并利用其SCHelp_HexStringToBytes方法 Something.setRetVal(Type.INT); // 指定返回參數的類型 } int i=0; Something.setParameter(i++,pSrc); Something.setParameter(i++,pTar); Something.setParameter(i++,MaxCount); System.out.println("調用的DLL文件名為:"+Something.getDLLName()); System.out.println("調用的方法名為:"+Something.getFunctionName()); //傳值 Something.invoke();//調用方法 return Something.getRetVal(); }finally{ if(Something!=null){ Something.dispose();//釋放 } } } public Pointer creatPointer() throws NativeException{ pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(36)); pointer.setIntAt(0, 36); return pointer; } public static void main(String[] args) throws NativeException, IllegalAccessException { UserCall uc = new UserCall(); String result = uc.getSomething("0FFFFF", uc.creatPointer(), 100); System.err.println("轉換成功的字節數為:"+result); TestCallback.runIt(); } }

總結

以上是生活随笔為你收集整理的利用JNative实现Java调用动态库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。