[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: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需要的不同的數據類型



這個使用很簡單,參數設定也很自由

//首先加載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)
的方法

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

**

Next: [Java] jawin 調用本地dll Prev: SUN原廠的資源