我有这个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中执行此操作?
答案 0 :(得分:3)
您需要将参数声明为特殊类型,以传达它们通过引用传递的事实。所以如果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():
documentation中详细介绍了这一点:
使用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());
或者,您可以使用具有单个元素的Java数组 期望的类型,但ByReference惯例更好地表达了意图 的代码。 Pointer类提供了许多访问器方法 除了有效地充当类型转换的getByteArray()之外 记忆。
可以通过从PointerType派生来声明类型安全指针 类。