没有使用JNA获得C ++ Struct

时间:2015-04-02 12:05:05

标签: java c++ jna

我已经google了很长时间,没有任何帮助。

编辑:这是实施technomage建议后的代码。

示例struct C ++代码:

typedef struct _SOMESTRUCT{
    const char* String1;
    const char* String2;
} SOMESTRUCT, *LPSOMESTRUCT;

用数据“填满”结构的示例C ++函数:

int GetSomeStruct(_SOMESTRUCT somes);

struct to java的翻译:

public class SomeStruct extends Structure{
    public String String1;
    public String String2;
    public class ByValue extends SomeStruct implements Structure.ByValue{}
    public SomeStruct(Pointer p){ //constructors of struct
        super(p);
        read();
    }
    public SomeStruct(){
         super();
         read();
    }
}

将函数转换为java方法:

int GetSomeStruct(SomeStruct.ByValue structref);

我如何从主Java应用程序执行代码:

EnclosingClass.SomeStruct sstruct = enclosingInstance.new SomeStruct();
EnclosingClass.SomeStruc.ByValue sstructval = sstruct.new ByValue();
enclosingInstanceofClasswithTranslatedCfunctions.GetSomeStruct(sstructref);

假设:

  • 在尝试使用该函数之前,我已正确执行了Native.loadLibrary。 (返回int的简单函数和接收事件通知的回调函数一样正常工作)
  • java翻译都在单独的文件中(如在c代码中)嵌套在扩展JNA库的公共类中。
  • 如果在c端执行良好,则GetSomeStruct返回的int为零。我一直都是零。

1 个答案:

答案 0 :(得分:1)

您的原生声明按值传递结构。以下声明是等效的:

int GetSomeStruct(struct _SOMESTRUCT somes);
int GetSomeStruct(SOMESTRUCT somes);

您需要定义Java映射以显式接受实现Structure.ByValue接口的参数。 JNA默认采用struct*,因此您需要使用明确的ByValue用法来表明您想要不同的内容。

public class MyStruct extends Structure {
    public class ByValue extends MyStruct implements Structure.ByValue { }
}

SOMESTRUCTtypedef struct _SOMESTRUCT,这是引用struct的最基本方式。两者都是类型说明符,可以互换使用。 _SOMESTRUCT通常被称为"标记"对于前面的结构定义。