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

如何获得对DLL的java JNA调用以获取参数中返回的数据?,java,delphi,jna,Java,Delphi,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

我有一个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);
void Foo(IntByReference i, DoubleByReference d);
您可以将其映射到如下Java函数:

procedure Foo(var i: Integer; var d: Double);
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参数

当函数接受指向类型参数的指针时,可以使用 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());
或者,您可以使用带有 需要的类型,但ByReference约定更好地传达了意图 这是守则的一部分。指针类提供了许多访问器方法 除了getByteArray()之外,它还可以有效地用作类型转换 在记忆中

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


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

procedure Foo(var i: Integer; var d: Double);
void Foo(IntByReference i, DoubleByReference d);
您可以将其映射到如下Java函数:

procedure Foo(var i: Integer; var d: Double);
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参数

当函数接受指向类型参数的指针时,可以使用 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());
或者,您可以使用带有 需要的类型,但ByReference约定更好地传达了意图 这是守则的一部分。指针类提供了许多访问器方法 除了getByteArray()之外,它还可以有效地用作类型转换 在记忆中

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


我不是JNA专家,但由于var参数是引用参数,我认为Java方面的东西不能声明和使用原语。你希望该日期参数会发生什么情况?@David我发现一些代码建议使用Date-Date=new-Date((long)(ReadingTimeRef.getValue()*1000.0));ReadingRecords[RecNo-1]。ReadingTime=日期;但我还没有测试它。我不是JNA专家,但由于var参数是引用参数,我认为Java方面的东西不能声明和使用原语。你希望这个日期参数会发生什么情况?@David我发现一些代码建议使用Date-Date=new-Date((长)(ReadingTimeRef.getValue()*1000.0));ReadingRecords[RecNo-1].ReadingTime=date;但我还没有测试它。