通过JNA调用dll函数,如何处理通过java指针传递的地址?

时间:2016-03-05 08:53:05

标签: java c++ native jna

我可以使用以下代码通过c ++调用dll函数:

 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不接受通过引用调用,我怎么能在这里通过引用传递??? 提前谢谢!

1 个答案:

答案 0 :(得分: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个实现。如果那些不满足您的需求,您总是可以从基础抽象类派生自己的。