首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java NativeCall库返回数据类型

Java NativeCall库返回数据类型
EN

Stack Overflow用户
提问于 2012-09-03 01:19:00
回答 1查看 671关注 0票数 0

我目前正在尝试使用来自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");

代码语言:javascript
复制
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的例子:

代码语言:javascript
复制
public interface SDE32 extends Library {
   public String sx_GetString(String cpFieldName);
   public Double sx_GetDouble(String cpFieldName);
   public Long sx_GetLong(String cpFieldName);

}

代码语言:javascript
复制
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

那么,如何获得这些返回类型呢?尤其是绳子。

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2012-09-04 14:23:49

我建议先返回指针(而不是字符串),然后使用各种指针方法检查指针指向的内存。一旦您了解了函数返回的内容,就可以知道如何使JNA正确地恢复数据(无论是自动的还是显式的)。

编辑

代码语言:javascript
复制
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类型的smallIntWordBool,以及int类型的Long。但是,切换到这些类型并不能提供完整的修复(它将减少堆栈损坏-您将使用错误的标志“打开”数据库)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12241009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档