Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 没有得到C++;使用JNA的结构_Java_C++_Jna - Fatal编程技术网

Java 没有得到C++;使用JNA的结构

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

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

编辑:这是实现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。(返回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”空的封闭类,但函数仍然没有将任何数据写入从此结构创建的对象。