【问题标题】:How to pass pointer to pointer (**) in JNA?如何在 JNA 中传递指向指针 (**) 的指针?
【发布时间】:2013-05-06 10:19:48
【问题描述】:

我在本机代码中有函数void clang_tokenize(CXTranslationUnit TU, CXSourceRange Range, CXToken **Tokens, unsigned *NumTokens);

该函数将返回**Tokens 中分配的令牌数组和*NumTokens 中的令牌计数。我已经使用 jnaerator 生成了结构,所以它们已经准备好了。我如何在java中编写函数签名(指向指针的指针是主要困难)?对于未签名的*,我在 JNA 中有 IntByReference。我应该使用 PointerByReference 吗?请举个例子

【问题讨论】:

    标签: java-native-interface jna


    【解决方案1】:

    假设CXToken是一个结构体,被调用函数返回一个被调用者分配的数组:

    PointerByReference pref = new PointerByReference();
    IntByReference iref = new IntByReference();
    
    clang_tokenize(tu, range, pref, iref);
    CXToken token = new CXToken(pref.getValue());
    CXToken[] tokens = (CXToken[])token.toArray(iref.getValue());
    

    【讨论】:

    • 在最后一行我收到一个错误:java.lang.IndexOutOfBoundsException:边界超出可用空间:com.sun.jna.Memory.boundsCheck(Memory. java:197) 在 com.sun.jna.Memory$SharedMemory.boundsCheck(Memory.java:73) 在 com.sun.jna.Memory.share(Memory.java:115) 在 com.sun.jna.Structure.toArray (Structure.java:1261) 在 com.sun.jna.Structure.toArray(Structure.java:1280)
    • toke.size() 不等于 iref.getValue() 出于某种原因,但它应该是恕我直言。我知道该值是从 Clang 返回的,它可能是错误的,但我认为它已经过足够的测试..
    • 哦,pref.size() 是令牌指针的大小,而不是令牌数组。但为什么我得到一个例外?
    • 对不起,我已经通过了 (CXToken[])token.toArray(getPointer());而不是 (CXToken[])token.toArray(iref.getValue());
    猜你喜欢
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多