gpt4 book ai didi

java - JNA:如何将字符串作为 void* 从 Java 传递到 C

转载 作者:行者123 更新时间:2023-11-30 03:08:32 25 4
gpt4 key购买 nike

我已经成功地将一个 void* 从 C 函数接收到 Java 中,并根据上下文将其转换为适当的类型,但现在我必须以相反的方式完成整个事情,而且我无法让它工作。

具体来说,我尝试调用的函数需要一个 void*,在本例中,其后面隐藏了一个 char*,当然在其后面隐藏了一个 char[]。 C 函数不操作数据,它只是读取数据。

所以我尝试从字符串创建一个 Byte[],然后将指针传递给它的第一个元素,如下所示:

    //transform the string into a byte array
byte[] byte_value = new_value.getBytes();
//create a pointer to the first byte
ByteByReference valueptr = new ByteByReference(byte_value[0]);
//pass the pointer to the function that sets the value
int result = lib.gp_widget_set_value(widget, valueptr.getPointer());

令我惊讶的是,没有发生任何崩溃。令我沮丧的是,该函数似乎根本没有获取数据。有人能看出我做错了什么吗?

函数gp_widget_set_value是由JNAerator基于libgphoto2生成的。生成的函数头(包括生成的注释)如下所示:

/**
* Original signature : <code>int gp_widget_set_value(CameraWidget*, const void*)</code><br>
* <i>native declaration : /usr/include/gphoto2/gphoto2-widget.h:840</i>
*/
int gp_widget_set_value(Gphoto2Library.CameraWidget widget, Pointer value);

Gphoto API 文档中实际 C 函数的文档:

int gp_widget_set_value ( CameraWidget * widget, const void * value )

Sets the value of the widget.

Parameters widget a CameraWidget value

Returns a gphoto2 error code.

Please pass (char*) for GP_WIDGET_MENU, GP_WIDGET_TEXT, GP_WIDGET_RADIO, (float) for GP_WIDGET_RANGE, (int) for GP_WIDGET_DATE, GP_WIDGET_TOGGLE, and (CameraWidgetCallback) for GP_WIDGET_BUTTON.

如果您想知道,最后一行指的是小部件类型,是的,我非常确定这是正确的。

最佳答案

您不需要任何复杂的东西。 JNA 处理最常见的 C 习惯用法。 JNAerator 从字面上为您提供了函数声明中的内容;它无法弄清楚 C 字符串、字符缓冲区、字符数组或指向单个字符的指针之间的语义差异。

int gp_widget_set_value(Gphoto2Library.CameraWidget widget, String value);

请注意,在这种情况下传递给 native 函数的内存是临时的,将在函数返回时被释放。如果您需要保留内存(这不是一个好主意),则需要使用Memory并维护对它的引用。

关于java - JNA:如何将字符串作为 void* 从 Java 传递到 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34159610/

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