java - 没有使用 JNA 获取 C++ 结构

标签 java c++ jna

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

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

示例结构 C++ 代码:

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

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

int GetSomeStruct(_SOMESTRUCT somes);

结构到 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 库的公共(public)类中。
  • 如果在 c 端一切正常,则 GetSomeStruct 返回的 int 为零。我一直为零。

最佳答案

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

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

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

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

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

关于java - 没有使用 JNA 获取 C++ 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29412543/

相关文章:

java - 如何在 eclipse helios 中为断点添加多个条件?

java - 使用 Java 读取 anchor 标记内的 href

java - 在没有 toArray 的情况下提高 JNA 性能

java - 将 JNA 结构的集合传递给 native 方法

Java添加程序到启动

java - 从 GAE 上传和下载 blob

java - Java 编译器是否可以重新排序同步语句以进行优化?

c++ - 如何让转发函数调用在转发函数之后声明的基本模板函数

c++ - 对 `boost::log_mt_posix::basic_attribute_set<char>::~basic_attribute_set()' 的 undefined reference

c++ - 有效维护略有不同(日志记录/非日志记录)的功能