2016-03-05 93 views
0

蔭能夠通過C++來調用的DLL函數,使用這些代碼:通過JNA調用dll函數,如何處理在java中通過指針的地址?

extern "C" 
    { 
    __declspec(dllimport) void _stdcall INPWAV 
       (char* Rad, int radLen, 
        float* wavlen); 
    } 
    . 
    . 
char rad[4]; 
float Wavlen; 
    . 
    . 
     INPWAV(rad,4,&m_Wavlen); 
    . 
    . 

但我想通過JNA從Java調用它,我想知道,我該如何處理地址的傳球,就像我通過在C指針++,因爲在java中沒有指針,並且java dones不支持像C++一樣的引用調用? 目前試圖Java作爲:

public class CallDll { 
    public interface callNative extends Library { 
     public void INPWAV(char Rad, int radLen,float wavlen); 
    } 
    public static void main(String[] args) { 
     callNative callNative1 = (callNative)Native.loadLibrary("PROCESSWAV", callNative.class); 
      char rad[] = new char[4]; 
     float Wavlen; 
     . 
     . 
     callNative1.INPWAV(rad,4,Wavlen); 
    } 
} 

但得到錯誤....作爲Java不接受引用調用,我怎麼能可以通過參考路過這裏??? 謝謝提前!

回答

0

原始數組作爲指針傳遞給內存緩衝區。

「語義地址」由com.sun.jna.ptr.ByReference類提供,其中包括FloatByReference(如果需要,支持存儲器的初始化)。

FloatByReference fref = new FloatByReference(5.0); 
// Equivalent to passing &float_value 
lib.callMyMethod(fref); 
float value = fref.getValue(); 

編輯

ByReference實現所有基本類型和通用指針存在的。如果這些不能滿足您的需求,您可以始終從基本抽象類中派生自己的派生類。

+0

謝謝,會試試這個,但是我們有這個整數,字符數組嗎? –