【发布时间】:2020-04-12 04:49:30
【问题描述】:
我在使用 JNA 将回调函数从 C-DLL 映射/转换为 Java 时遇到问题。
在C头文件中写入如下回调函数:
// ! callback function header whenever a data report is received from a device
typedef void (FR_callback_func)(Data_t frame);
上述Data_t的结构如下:
// ! Carries information about one signal.
typedef struct
{
unsigned char index;
int isval;
unsigned short val;
int arr_Length;
unsigned char array[8];
} Data_t ;
Data_t 结构被调用的函数:
int getData(int val,Data_t *data);
现在我翻译成我的JAVA代码如下:
public interface device extends Library
{
public interface FR_callback_func extends Callback
{
void invoke(Data_t signal);
}
public class Data_t extends Structure implements com.sun.jna.Structure.ByReference
{
public static class ByReference extends Data_t implements Structure.ByReference { }
public byte index;
public int isval;
public short val;
public int arr_Length;
public byte[] array = new byte[8];
@Override
protected java.util.List<java.lang.String> getFieldOrder()
{
return Arrays.asList(new String[] {"index","isval","val","arr_Length","array"});
}
}
public int getData (int val,Data_t.ByReference data);
}
然后我尝试在我的主要功能中使用它,如下所示:
public static void main(String[] args) throws IOException
{
Data_t .ByReference data_t = new Data_t .ByReference();
int data = 0;
int val = 0;
device h = (device) Native.load("Library", device.class);
data = h.getData (val, data_t);
}
我的问题是我是否正确翻译了上面的 C 代码?特别是回调函数?由于无法操纵C代码。因此我必须在 JAVA 中翻译提供的 C-DLL 代码。
我们将非常感谢您的建议。
【问题讨论】:
-
这可能是由于填充问题吗?在
Data_t定义中,它以和unsigned char开头,后跟int,但我们大多数人不希望第二个结构成员从第二个字节开始:编译器通常包含填充以对齐int在自己的边界上。这意味着结构中存在几个字节的不可见填充,这些字节不能通过直接读取结构定义来解决。或许与此有关? -
@Steve Friedl 不,我不认为这是由于这个问题。我认为的问题是我必须用Java翻译的回调函数的定义。
-
BL_signal_t是在哪里创建的?我会在 C 端检查Data_t *data是否为空指针(在这种情况下很早就存在)。 -
@jerch 我编辑了我的帖子,这不是
BL_signal_t实际上是Data_t -
@Sid 你应该从Java端的方法声明中删除
.ByReference,并提供一个预先创建的Data_t变量,JNA会自动处理下面的指针。
标签: java c eclipse dll dynamic-dll-import