通过JNA调用dll函数,如何处理java中通过指针传递的地址?
Calling dll functions, through JNA, How to handle address passing through pointers in java?
我能够通过 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 不支持像 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 不接受引用调用,我怎样才能在这里通过引用传递???
提前谢谢!
原始数组作为指向内存缓冲区的指针传递。
"Address of" 语义由 com.sun.jna.ptr.ByReference
classes, which include FloatByReference
提供(如果需要,它支持内存初始化)。
FloatByReference fref = new FloatByReference(5.0);
// Equivalent to passing &float_value
lib.callMyMethod(fref);
float value = fref.getValue();
编辑
ByReference
所有基本类型和通用指针都存在实现。如果这些不能满足您的需求,您总是可以从基本摘要中派生出您自己的 class。
我能够通过 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 不支持像 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 不接受引用调用,我怎样才能在这里通过引用传递??? 提前谢谢!
原始数组作为指向内存缓冲区的指针传递。
"Address of" 语义由 com.sun.jna.ptr.ByReference
classes, which include FloatByReference
提供(如果需要,它支持内存初始化)。
FloatByReference fref = new FloatByReference(5.0);
// Equivalent to passing &float_value
lib.callMyMethod(fref);
float value = fref.getValue();
编辑
ByReference
所有基本类型和通用指针都存在实现。如果这些不能满足您的需求,您总是可以从基本摘要中派生出您自己的 class。