Java 没有得到C++;使用JNA的结构
我在谷歌上搜索了很长时间,没有任何帮助 编辑:这是实现technomage建议后的代码 实例结构C++代码:Java 没有得到C++;使用JNA的结构,java,c++,jna,Java,C++,Jna,我在谷歌上搜索了很长时间,没有任何帮助 编辑:这是实现technomage建议后的代码 实例结构C++代码: typedef struct _SOMESTRUCT{ const char* String1; const char* String2; } SOMESTRUCT, *LPSOMESTRUCT; 示例C++函数,用数据填充结构: int GetSomeStruct(_SOMESTRUCT somes); 将struct转换为java: public class So
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。(返回int的简单函数与接收事件通知的回调函数一样工作正常)
- java翻译都在独立的文件(如c代码)中,嵌套在扩展JNA库的公共类中
- 如果在c端执行良好,则GetSomeStruct返回的int值为零。我一直得零分
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 { }
}
SOMESTRUCT
是struct\u SOMESTRUCT
的typedef
,这是引用该struct
的最基本方式。两者都是类型说明符,可以互换使用<代码>\u SOMESTRUCT通常被称为它前面的结构定义的“标记”。因此,我应该向java结构添加一个ByValue类,并将其传递给c函数的java映射,该映射应该经过编辑以接受structure.ByValue参数?在GetSomeStruct的第一个示例中,为什么括号中有三个单词?另外,您可以推荐一本关于JNA的书吗?是的,您需要指定“按值”(struct
)语义,而不是“按引用”(struct*
)。我不知道任何JNA的书,但是,是非常彻底的,欢迎提交的改进和问题。不知道我错过了什么。我删除了“by reference”并添加了“by value”空的封闭类,但函数仍然没有将任何数据写入从此结构创建的对象。