如何获得对DLL的Java JNA调用以获取参数中返回的数据?

我有这个java测试

package ftct;

import com.sun.jna.Library;

import com.sun.jna.Native;

import com.sun.jna.Platform;

import com.sun.jna.win32.StdCallLibrary;

import java.util.Date;

public class LibFTCT {

public LibFTCT() {

}

public interface LibFTCTLib extends StdCallLibrary {

LibFTCTLib INSTANCE = (LibFTCTLib) Native.loadLibrary(

"FTCTLib", LibFTCTLib.class);

int a(int x);

int DoCommand(int Command, int Param);

int GetDataRecord(int RecordNum, int StreamNum, Date ReadingTime,

double AIN1, double AIN2, double AIN3, double AIN4);

}

}

它调用一个Delphi DLL。如果在Delphi中将参数设置为var,则Java崩溃。否则,它们是只读的。

我希望GetDataRecord返回RecordNum等中的数据。如何在Java中执行此操作?

回答:

您需要将参数声明为特殊类型,以传达通过引用传递它们的事实。因此,如果Delphi参数是这样的:

procedure Foo(var i: Integer; var d: Double);

您可以将其映射到这样的Java函数:

void Foo(IntByReference i, DoubleByReference d);

并调用该函数:

IntByReference iref = new IntByReference();

DoubleByReference dref = new DoubleByReference();

INSTANCE.Foo(iref, dref);

int i = iref.getValue();

double d = dref.getValue():

文档中对此进行了详细介绍:

当函数接受指向类型的指针参数时,您可以使用ByReference类型之一来捕获返回的值,或者使用您自己的子类。例如:

// Original C declaration

void allocate_buffer(char **bufp, int* lenp);

// Equivalent JNA mapping

void allocate_buffer(PointerByReference bufp, IntByReference lenp);

// Usage

PointerByReference pref = new PointerByReference();

IntByReference iref = new IntByReference();

lib.allocate_buffer(pref, iref);

Pointer p = pref.getValue();

byte[] buffer = p.getByteArray(0, iref.getValue());

另外,您可以将Java数组与所需类型的单个元素一起使用,但是ByReference约定可以更好地传达代码的意图。除了getByteArray()之外,Pointer类还提供了许多访问器方法,这些方法可以有效地用作对内存的类型转换。

类型安全的指针可以通过从PointerType类派生来声明。

以上是 如何获得对DLL的Java JNA调用以获取参数中返回的数据? 的全部内容, 来源链接: utcz.com/qa/430286.html

回到顶部