我目前正在尝试使用来自 Java 的 NTX 索引访问 DBF。我有一个多年前的 Artemis 引擎(现在是 ApolloDB)的副本,它可以在 VB6 中执行此操作。它主要使用 3 个 DLL,主要是 SDE32.DLL。
我已经使用 NativeCall 成功访问了这些 DLL 中的许多函数
public static VoidCall sx_Zap = new VoidCall("SDE32", "sx_Zap");
public static IntCall sx_Use = new IntCall("SDE32", "sx_Use");
intFile = sx_Use.executeCall(fileName);
if (intFile == 0){
if (JOptionPane.showOptionDialog(null, "Could not open:" + fileName + "\nRetry?", "Failed to open DBF", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null) != JOptionPane.YES_OPTION){
return;
}else{
sx_Zap.executeCall();
}
}
该代码将非常高兴地打开并删除数据库,因此我知道我在正确的轨道上。请注意,当我想返回一个整数时,我使用了 IntCall,而当我不想返回任何内容时,我使用了 VoidCall。
我发现的问题是一些函数,如一些数据访问函数返回字符串,例如 VB6 中的 sx_GetString 函数的函数声明,该函数从当前记录中获取一个字符串字段。
Declare Function sx_GetString Lib "sde32.dll" (ByVal cpFieldName As String) As String
如何将这些信息导入 Java?似乎只有 int(和 boolean)和 void 返回类型,我怎样才能得到 String、double 和 long 类型?
使用 JNA,我似乎可以访问双精度和长整数,但是当我尝试使用字符串返回类型时,我得到了执行保护违规并且 Java 崩溃了。
JNA 示例:
public interface SDE32 extends Library {
public String sx_GetString(String cpFieldName);
public Double sx_GetDouble(String cpFieldName);
public Long sx_GetLong(String cpFieldName);
}
JNADBF.SDE32 sde = (JNADBF.SDE32) Native.loadLibrary("SDE32", JNADBF.SDE32.class);
System.out.println(sde.sx_GetString("TILLNAME"));
System.out.println(sde.sx_GetDouble("SELLPRICE"));
JNA 错误:
Execution protection violation
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000, pid=11104, tid=11060
那么我怎样才能得到这些返回类型呢?尤其是字符串。
非常感激任何的帮助。