我有一个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 [] 。
答案 0 :(得分:0)
如果我使用不同的方法签名:
boolean doSomething(Pointer results);
确实有效。但后来我必须从Result []转换为我自己的指针。
答案 1 :(得分:0)
转换是微不足道的,只需在结构数组的第一个元素上调用Structure.getPointer()(假设您首先从Structure.toArray获取了数组)。
使用直接映射时,你真的会更好;当传递非原始的非指针类型时,JNI层必须回调到VM以获取适当的本机数据。
在直接映射中提供支持Structure []参数的问题。这应该得到支持(JNA文档指出Pointer / String / WString / NativeMapped的数组不支持)。