[Java] JNative
JAWIN和JNative是開源組件,使用這兩種方法可以直接調用寫好的dll檔案,Jawin 數據類型匹配相當敏感,它採用一種叫做”instruction string”的格式來傳遞參數,至今還沒學會。
我是使用JNative方法調用dll檔案。
需要下載一個JNative的壓縮包,
解壓獲得三個檔案,分別是︰JNativeCpp.dll,libJNativeCpp.so,JNative.jar 。
JNativeCpp.dll Windows下用的,拷到windows / system32目錄下;
libJNativeCpp.so Linux下的格式檔案;
JNative.jar 這是一個擴展包,將其copy到C:Javajre1.5.0lib下(我的目錄架構),系統會自動加載,也可以用eclipse直接加載。
方法︰
Class | 作用 | 一般用到的方法 (**参考Javadoc**) | |
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需要的不同的數據類型 |
具体参考API:http://jnative.free.fr/docs/
這個使用很簡單,參數設定也很自由
//首先加載dll和需要的方法
JNative messageBox = new JNative(“dll_name.dll”, “method_name”);
//返回值數據類型
messageBox.setRetVal(Type.INT);
//參數設定
messageBox.setParameter(0, Type.STRING,”piserver”);
//營運
messageBox.invoke();
====================================
取得回傳值
getRetVal()
TYPE
**[DOUBLE](http://jnative.free.fr/docs/org/xvolks/jnative/Type.html#DOUBLE)** Used for in params of type double |
**[FLOAT](http://jnative.free.fr/docs/org/xvolks/jnative/Type.html#FLOAT)** Used for in params of type float |
**[INT](http://jnative.free.fr/docs/org/xvolks/jnative/Type.html#INT)** Used for in params of type bool, byte to long (32 bits) |
**[LONG](http://jnative.free.fr/docs/org/xvolks/jnative/Type.html#LONG)** Used for in params of type int64 (64 bits) |
**[PSTRUCT](http://jnative.free.fr/docs/org/xvolks/jnative/Type.html#PSTRUCT)** (指標)Not use directly, use a Pointer(指標) object instead This is used internaly for out parameters. |
**[STRING](http://jnative.free.fr/docs/org/xvolks/jnative/Type.html#STRING)** Used for in params of type const char*, LPCSTR |
**[VOID](http://jnative.free.fr/docs/org/xvolks/jnative/Type.html#VOID)** Used only for return values |
**
有指標時的用法
*
假設dllName.dll裡有
FuntionName(string str)
的方法
FuntionName(string str)
的方法
JNative funDLL = new JNative(dllName.dll, “FuntionName”);
funDLL.setRetVal(Type.INT);
//参数设置
Pointer pointer1 = new Pointer( new HeapMemoryBlock(50));
//設定要預用多少記憶體空間來放指標
pointer1.setStringAt(0 ,”指標初值”);
//設定初值
System.out.println(pointer1.getAsString()); //會印出 指標初值
funDLL.setParameter(0, pointer1);
//運行dllFuntion
funDLL.invoke();
System.out.println(pointer1.getAsString());
//印出指標的值
funDLL.setRetVal(Type.INT);
//参数设置
Pointer pointer1 = new Pointer( new HeapMemoryBlock(50));
//設定要預用多少記憶體空間來放指標
pointer1.setStringAt(0 ,”指標初值”);
//設定初值
System.out.println(pointer1.getAsString()); //會印出 指標初值
funDLL.setParameter(0, pointer1);
//運行dllFuntion
funDLL.invoke();
System.out.println(pointer1.getAsString());
//印出指標的值
**