gpt4 book ai didi

java - 具有结构 JNA 数组的结构

转载 作者:行者123 更新时间:2023-11-28 03:06:51 27 4
gpt4 key购买 nike

我有以下 C++ 结构和函数:

typedef struct _Phase_Information
{
char infoMessage[MAX];
} INFORMATION;

typedef struct _Informations
{
int infoCount;
INFORMATION *infoArray;
} INFORMATIONS ;

int GetInformations(INFORMATIONS *pInfos);

我这样使用它们:

INFORMATIONS informations;
INFORMATION * informationArray = new INFORMATION[MAX_INFOS];
informations.info = informationArray;
int error = GetInformations(&informations);

现在我想通过 JNA 在 Java 中使用我的 C++ 库...所以我执行了以下操作:

public class Information extends Structure {
public char[] infoMessage = new char[MAX];
public Information () { super(); }
protected List<? > getFieldOrder() {
return Arrays.asList("infoMessage ");
}
public Information (char infoMessage []) {
super();
if ((infoMessage .length != this.infoMessage .length))
throw new IllegalArgumentException("Wrong array size !");
this.infoMessage = infoMessage ;
}

public static class ByReference extends Information implements Structure.ByReference {};
public static class ByValue extends Information implements Structure.ByValue {};
}

public class Informations extends Structure {
public int infoCount;
public Information.ByReference infoArray;
public Informations () { super(); }
protected List<? > getFieldOrder() {
return Arrays.asList("infoCount", "infoArray");
}
public Informations(int infoCount, Information.ByReference infoArray) {
super();
this.infoCount= infoCount;
this.infoArray= infoArray;
}
public static class ByReference extends Informations implements Structure.ByReference {};
public static class ByValue extends Informations implements Structure.ByValue {};
}

我试过这样调用库:

Informations.ByReference informations = new Informations.ByReference();
informations.infoArray= new Information.ByReference();
int error = CLib.GetInformations(Informations);

Information[] test =(Information[])informations.infoArray.toArray(Informations.infoCount);

有时我只检索数组的第一个元素,但其余时间我的 Java 崩溃......所以我相信这与未在 Java 站点上分配内存有关,但我无法进一步获取:/

最佳答案

原生char对应Javabyte

请注意,您的示例将大小为 1 的数组传递给 GetInformations

除了很可能导致崩溃的不正确映射之外,您的映射看起来还不错。

编辑

您应该将 infoCount 初始化为您传入的数组的大小(在您的示例中为“1”)。如果你想传入一个更大的数组,你需要在 informations.infoArray 上调用 .toArray() 来调用 获取信息()。当您调用 Structure.toArray() 时,会为额外的数组元素分配内存;在那之前,您只为单个元素分配了内存。

关于java - 具有结构 JNA 数组的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19455366/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com