我目前正在尝试使用来自Java的NTX索引访问DBFs。我有一份许多年前的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。
我发现的问题是,一些函数,如一些数据访问函数,返回string,例如,VB6中的函数声明用于sx_GetString函数,该函数从当前记录中获取一个字符串字段。Declare Function sx_GetString Lib "sde32.dll" (ByVal cpFieldName As String) As String
如何将这些信息输入Java?似乎只有int (和boolean)和void返回类型,我如何才能得到字符串、双类型和长类型?
使用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
那么,如何获得这些返回类型呢?尤其是绳子。
任何帮助都将不胜感激。
发布于 2012-09-04 14:23:49
我建议先返回指针(而不是字符串),然后使用各种指针方法检查指针指向的内存。一旦您了解了函数返回的内容,就可以知道如何使JNA正确地恢复数据(无论是自动的还是显式的)。
编辑
public interface SDE32 extends StdCallLibrary {
public Pointer sx_GetString(String cpFieldName); // don't use String just yet
public double sx_GetDouble(String cpFieldName);
// Don't use Java "long" unless you want a 64-bit integer
// On windows, native "int" and "long" are both 32 bits
public NativeLong sx_GetLong(String cpFieldName);
}编辑引用pascal头文件作为最新版本,您应该使用short类型的smallInt和WordBool,以及int类型的Long。但是,切换到这些类型并不能提供完整的修复(它将减少堆栈损坏-您将使用错误的标志“打开”数据库)。
https://stackoverflow.com/questions/12241009
复制相似问题