我在谷歌上搜索了很长时间,没有任何帮助。
编辑:这是实现 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 { }
}
SOMESTRUCT
是 struct _SOMESTRUCT
的 typedef
,这是引用该 struct
的最基本方式.两者都是类型说明符,可以互换使用。 _SOMESTRUCT
通常被称为它前面的结构定义的“标签”。
关于java - 没有使用 JNA 获取 C++ 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29412543/