【问题标题】:Not getting C++ Struct using JNA没有使用 JNA 获取 C++ 结构
【发布时间】:2015-04-10 21:33:10
【问题描述】:

我用谷歌搜索了很长时间,没有任何帮助。

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

结构 C++ 代码示例:

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

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

int GetSomeStruct(_SOMESTRUCT somes);

struct 到 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。 (返回整数的简单函数和接收事件通知的回调函数一样工作正常)
  • Java 翻译都位于单独的文件中(如在 c 代码中),嵌套在扩展 JNA 库的公共类中。
  • 如果一切都在 c 端执行良好,则 GetSomeStruct 返回的 int 为零。我一直在归零。

【问题讨论】:

    标签: java c++ jna


    【解决方案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 { }
    }
    

    SOMESTRUCTstruct _SOMESTRUCTtypedef,这是引用struct 的最基本方式。两者都是类型说明符,可以互换使用。 _SOMESTRUCT 通常被称为它前面的结构定义的“标签”。

    【讨论】:

    • 所以我应该向 java 结构添加一个 ByValue 类,并将其传递给应该被编辑为接受 Structure.ByValue 参数的 c 函数的 java 映射?在 GetSomeStruct 的第一个示例中,为什么括号中有三个单词?另外,有没有关于 JNA 的书可以推荐?
    • 是的,您需要指定“按值”(struct) 语义而不是“按引用”(struct*)。我不知道有任何 JNA 书籍,但是,the project documentation 非常详尽,欢迎在jna-users mailing list 上提交改进意见和问题。
    • 不确定我错过了什么。我删除了“按引用”并添加了“按值”空封闭类,但该函数仍然没有向从该结构创建的对象写入任何数据。
    猜你喜欢
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 2016-01-11
    相关资源
    最近更新 更多