如何获取对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。 如果将参数作为var放在Delphi中,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参数

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

 // 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类派生来声明类型安全指针。