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:\Java\jre1.5.0\lib下(我的目錄架構),系統會自動加載,也可以用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 Used for in params of type double |
FLOAT Used for in params of type float |
INT Used for in params of type bool, byte to long (32 bits) |
LONG Used for in params of type int64 (64 bits) |
PSTRUCT (指標)Not use directly, use a Pointer(指標) object instead This is used internaly for out parameters. |
STRING Used for in params of type const char*, LPCSTR |
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());
//印出指標的值
*****************************
沒有留言:
張貼留言