8/11/2008

[Java] JNative


    網上最多的就是使用JNI調用dll的方法,試了試發現JNI和JNA方法對dll包的路徑都很嚴格,一般都是調用自己寫的dll檔案,要是調用已經寫好的就需要Java類的路徑和dll裡的路徑是一致的,不然能找到這個dll檔案也不能讀取裡面的內容,(我是這么理解的,因為我就沒成功,呵呵)只能自己再寫一個dll檔案調用你需要的那個已經有的檔案,然後在用java調用自己寫的這個dll檔案。
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)
的方法

            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());
            //印出指標的值

*****************************


沒有留言:

張貼留言