问题描述
您需要将参数声明为特殊类型,以传达通过引用传递它们的事实。因此,如果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类派生来声明。
解决方法
我有这个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中执行此操作?