返回和访问 jna 中结构对象的数组

2023-12-02

我有一个包含 C 语言中的一些 char 指针的结构:

struct inputsheet
{
    char* TestCaseID[MAX_TEST_CASES];
    char*  Description[MAX_TEST_CASES];
};

我有一个返回结构对象数组的函数:

struct inputsheet* getapi(char *docname);

现在我想在Java中使用它。我该如何处理这个结构对象数组?我能够处理单个对象,但不能处理数组。

对于单个对象,我的 C 代码如下:

public class str3 extends com.sun.jna.Structure implements com.sun.jna.Structure.ByReference {  
   public Pointer a1;
   public Pointer b2;
   public Pointer c3[]=new Pointer[10];
}

访问它:

str2 s2=CLibrary.INSTANCE.parseid(xmlFile1);
for(Pointer p1:s2.testCaseID) {
    if(p1!=null)
    {
        System.out.println(p1.getString(0));
    }
}

EDIT

\\c code
struct str3{
char *a;
char *b;
char *ab[10];
}

\\jna implementation


package parser;
import com.sun.jna.Pointer;
public class str3 extends com.sun.jna.Structure implements     com.sun.jna.Structure.ByReference{ 
public Pointer a1;
public Pointer b2;
public Pointer c3[]=new Pointer[10];
}


\\calling it
import com.sun.jna.Native;
import com.sun.jna.Pointer;
 class ab{
    interface CLibrary extends Library{
    CLibrary INSTANCE = (CLibrary) Native.loadLibrary("chardll",
    CLibrary.class);
    str3 getStruct();
    }

public static void main(String[] args) {
    int size = 5;
    str3 a=CLibrary.INSTANCE.getStruct();
    str3[] ab=(str3[])a.toArray(size);
    System.out.println(ab[0].a1.getString(0));          
    }
}

它给出垃圾值作为输出,我必须更新我的代码才能获得正确的输出。


来自javadoc:

返回结构体数组

将该方法声明为返回适当类型的结构,然后调用Structure.toArray(int)转换为数组 适当大小的初始化结构。请注意,您的Structure类必须有一个无参数构造函数,并且您是 负责释放返回的内存(如果适用于任何情况) 方式适合被调用的函数。

// Original C code
struct Display* get_displays(int* pcount);
void free_displays(struct Display* displays);

// Equivalent JNA mapping
Display get_displays(IntByReference pcount);
void free_displays(Display[] displays);
...
IntByReference pcount = new IntByReference();
Display d = lib.get_displays(pcount);
Display[] displays = (Display[])d.toArray(pcount.getValue());
...
lib.free_displays(displays);

EDIT

名义上,您的结构将如下所示(基于您的本机定义):

class inputsheet extends Structure {
    public Pointer[] TestCaseID = new Pointer[MAX_TEST_CASES];
    public Pointer[] Description = new Pointer[MAX_TEST_CASES];
}

public inputsheet getapi(String docname);

int size = ...; // whatever you do to figure out the size of your returned array 
inputsheet sheet = INSTANCE.getapi("some-doc");
inputsheet[] sheets = (inputsheet[])sheet.toArray(size);

如果调用者不需要写入inputsheet字段,你应该使用String代替Pointer.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

返回和访问 jna 中结构对象的数组 的相关文章

随机推荐

  • 将 XRAY 跟踪添加到非休息功能,例如 SQS、Cognito 触发器等

    使用无服务器框架 我有未附加到 API 网关端点的函数 例如 认知触发器 S3 Event DynamoDB 流 SQS活动 我还使用 XRAY 追踪 我将其设置为tracing true在我的 serverless yml 文件中 看来这
  • Woocommerce API 认为图像 SRC 是一种不同类型的文件,而不是 JPG

    Example images gt array 6 0 gt array 2 src gt string 112 https nz tradevine com BlobStorage GetFullPhoto photoID 3783754
  • 在 livebindings CustomFormat 中使用 Format

    我正在尝试使用 LiveBindings 来格式化数字以在 FireMonkey 表单上的 TEdit 中显示 我正在尝试使用绑定的 CustomFormat 中的 Format 方法来格式化具有两位小数的数字 我可以对输出进行 硬编码 F
  • Python;通过 select 控制死套接字时出现问题

    我有一些代码将连接到主机 除了监听传入数据之外什么都不做 直到客户端关闭或主机发送关闭语句 为此 我的代码运行良好 然而 当主机在没有发送关闭语句的情况下死亡时 我的客户端将按照预期永久监听传入数据 为了解决这个问题 我每隔 foo 秒设置
  • Node.js 是否有一个好的类似广播的音频流解决方案?

    我正在寻找一些东西来使用node js 传输音频 例如广播 连续播放并且客户端可以在歌曲中间加入 是否有任何 Node js 模块 我找不到 或其他任何可以与 Node js 一起使用来实现此目的的模块 这对于node js 来说是可能的吗
  • 如何将 unicode 代码点转换为十六进制 HTML 实体?

    我有一个数据文件 准确地说是一个 Apple plist 其中包含Unicode 代码点 like U00e8 and U2019 我需要将它们转换为有效的十六进制HTML 实体使用 PHP 我现在正在做的是一长串 fileContents
  • “索引 0 为负数或高于行数”错误 C#

    我太需要帮助了 我收到以下异常 索引 0 为负数或高于行计数错误 我在 stackoverflow 和 google 上进行了研究 但无法修复错误 My code if lb Gmy SelectedItems Count gt 0 str
  • 始终返回上周周一到周日的数据

    如何写一条始终返回上周一到上周日数据的sql语句 任何指导表示赞赏 Thanks t clausen dk 的回答确实有效 但可能不清楚why它有效 无论是对你还是对你之后的开发人员 由于增加清晰度有时会以简洁性和性能为代价 因此我想解释一
  • 为 Chrome 扩展程序运行 Identity.getAuthToken 时出现错误“此帐户的服务已被禁用”

    我正在尝试创建一个使用所选数据并将其保存到谷歌表格的扩展程序 听起来很简单 但我被困在 Auth2 部分 这是我到目前为止所做的 我创建了一个manifest json并上传到chrome开发者仪表板上以获取 key 和 id 使用 id
  • 从nodejs连接oracle

    过去几周我一直在尝试从我的nodejs 代码连接oracle db 到目前为止我发现的是 2 个主要库 例如https github com mariano node db oracle已经过时了 上次更新是在一年前 第二个是https g
  • 通用下限通配符与上限通配符

    import java util List import java util ArrayList interface Canine class Dog implements Canine public class Collie extend
  • 如何获得循环中产生的 char 值的总和?

    很抱歉 如果标题具有误导性或令人困惑 但这是我的困境 我正在输入一个字符串 并且想要为字母表中的每个大写字母分配一个值 A 1 Z 26 然后添加该字符串中每个字母的值 Example ABCD 10 因为 1 2 3 4 但我不知道如何添
  • 将图像与实际屏幕进行比较

    我想让我的 Java 程序将实际屏幕与图片 屏幕截图 进行比较 我不知道是否可行 但我在Jitbit 宏记录器 中看到过它 我想自己实现它 也许通过这个例子你就明白我的意思了 Thanks 编辑 换句话说 是否可以检查图像是否显示 要查找并
  • 将 Visual Studio 2005 与 ClearCase Eclipse 文件结合使用

    我尝试将 Visual Studio 2005 与 ClearCase 遮蔽文件一起使用 查看私有的 遮蔽 版本化文件 但每当我将文件保存在 VS 中时 它都会变得不遮蔽 并返回到版本化文件 在 Linux 中 我使用 VIM 而不是 Vi
  • EPPlus 号码格式

    我有一张用 Epplus 生成的 Excel 工作表 我遇到了一些痛点 我希望得到解决了类似挑战的人的指导 我需要将数字格式应用于双精度值 并且我想像这样在 Excel 中呈现它 8 8 0 12 12 0 14 54 14 5 0 0 0
  • 使用输出缓存配置文件时如何抑制标头 Vary:*

    使用下面给出的任何 OutputCacheProfiles
  • 通过管道输出到 bash 函数

    我在 bash 脚本中有一个简单的函数 我想将 stdout 作为输入传递给它 jc hms printf 1 我想以这种方式使用它 var echo teststring jc hms 当然 我使用了多余的函数 echo 和 printf
  • Javascript 通过 for 循环分配事件处理程序

    如果我对事件显得有点 菜鸟 我深表歉意 但无论出于何种原因 以下内容对我不起作用 var someDomRef document getElementByRef refVal for i 0 i
  • 从 ul 中删除动态创建的 li

    我使用 jquery 在 DOM 加载后动态添加和删除项目符号 这是添加项目符号的代码 效果很好 add bullet linkedEventList ul append li datum headline a href title del
  • 返回和访问 jna 中结构对象的数组

    我有一个包含 C 语言中的一些 char 指针的结构 struct inputsheet char TestCaseID MAX TEST CASES char Description MAX TEST CASES 我有一个返回结构对象数组