JNA直接调用不使用参数Structure []

时间:2011-12-09 00:19:48

标签: java native jna

我有一个C ++函数:

struct Result {
    //...
};
bool doSomething(Result[]);

如果我使用以下JNA绑定,函数调用可以正常工作:

public class Result extends Structure {
    //...
}

public interface CPPLibrary extends Library {
    public static final CPPLibrary INSTANCE = (CPPLibrary)Native.loadLibrary("dllname");
    boolean doSomething(Result[]);
}

但是通过直接调用,我点击 IllegalArgumentException 类[Lcom.usta.Result;不是受支持的参数类型(在类com.usta.CPPLibrary中的方法calcPV01中)。我直接调用映射的JNA代码:

public class CPPLibrary implements Library {
    Native.register("dllname");
    public static native boolean doSomething(Result[]);
}

我可以在 com.sun.jna.Function#convertArgument()中看到显式处理 Structure [] com.sun.jna.Native#getConversion (),由直接调用映射使用,不处理 Structure []

2 个答案:

答案 0 :(得分:0)

如果我使用不同的方法签名:

boolean doSomething(Pointer results);

确实有效。但后来我必须从Result []转换为我自己的指针。

答案 1 :(得分:0)

转换是微不足道的,只需在结构数组的第一个元素上调用Structure.getPointer()(假设您首先从Structure.toArray获取了数组)。

使用直接映射时,你真的会更好;当传递非原始的非指针类型时,JNI层必须回调到VM以获取适当的本机数据。

在直接映射中提供支持Structure []参数的问题。这应该得到支持(JNA文档指出Pointer / String / WString / NativeMapped的数组不支持)。