9

如何从 JNA 调用具有 C 中此方法签名的方法?

int open_device(context *ctx, device **dev, int index);

C 方法的最后两行如下所示:

*dev = pdev;
return 0;

这是该方法中的唯一用途dev。这意味着我必须将指针传递给指向该方法的空指针,对吗?然后该方法用对象的地址填充空指针,device我可以将指向设备的指针传递给其他方法。

我的问题是:这是正确的方法吗?如果是,我如何从 Java 分配一个新指针?


根据接受的答案,我这样做了:

Memory p = new Memory(Pointer.SIZE);
Memory p2 = new Memory(Pointer.SIZE);
p.setPointer(0, p2);
nativeLib.open_device(ctx, p, index);
return p2;
4

3 回答 3

9

似乎 JNAPointer类具有允许多重间接的方法,并且setPointer该类实际上“分配”本机对象。所以你应该能够做类似的事情:(我只是从 JNA 文档中猜测,我没有测试过这个)getPointerMemory

Pointer pDev = new Memory(Pointer.SIZE); // allocate space to hold a pointer value
// pass pDev to open_device
Pointer dev = pDev.getPointer(0);        // retrieve pointer stored at pDev
于 2010-11-27T22:45:49.453 回答
0

更好的答案。您可能希望根据 Java 字符串长度分配(malloc 等)。下面的示例是来自 JNA 项目的单元测试。

public void testGetSetStringWithDefaultEncoding() throws Exception {
    final String ENCODING = Native.DEFAULT_ENCODING;
    String VALUE = getName();
    int size = VALUE.getBytes(ENCODING).length+1;
    Memory m = new Memory(size);
    m.setString(0, VALUE);
    assertEquals("Wrong decoded value", VALUE, m.getString(0));
}
于 2015-11-22T11:26:21.737 回答
-1

Java中没有指针,只有引用。

当您将它们传递给方法时,您不能重新分配引用,因为您按值传递它们。在 Java 中,一切都是按值传递的。

您可以重写此方法以实例化设备的新实例并返回它而不是 int。

于 2010-11-27T22:35:02.983 回答