代码之家  ›  专栏  ›  技术社区  ›  thejh

如何在Java中获取新指针?

  •  8
  • thejh  · 技术社区  · 14 年前

    如何在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;
    
    3 回复  |  直到 14 年前
        1
  •  9
  •   Brian McCutchon    7 年前

    看来JNA Pointer 类具有 setPointer getPointer 允许多个间接寻址的方法,以及 Memory 类来实际“分配”本机对象。所以您应该能够做如下事情:(我只是从JNA文档中猜测,我没有测试过这个)

    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
    
        2
  •  0
  •   duffymo    14 年前

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

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

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

        3
  •  0
  •   Ashish Jain    9 年前

    更好的回答。您可能需要根据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));
    }