[英]How to pass a struct including a array of primitive type in JNA?
我是JNA的新手開發人員,因此,如果這個問題很瑣碎,請原諒我,但我努力避免使用CNA結構對象,包括JNA的float數組。 目前,我收到了一個編譯錯誤。
我認為問題是初始化FloatByReference實例( mys.Weights
)並將其分配給mystruct類實例( mys
)的錯誤方法,並且認為不應修改以下Java代碼,因為JNAerator自動生成了它。
我的C代碼:
typedef struct
{
int n;
float *Weights;
} mystruct;
void testfunc(mystruct* mys){
printf(mys->Weights[0]);
}
public interface CLibrary extends Library {
public static final String JNA_LIBRARY_NAME = "test";
public static final NativeLibrary JNA_NATIVE_LIB = NativeLibrary.getInstance(CLibrary.JNA_LIBRARY_NAME);
public static final CLibrary INSTANCE = (CLibrary)Native.loadLibrary(CLibrary.JNA_LIBRARY_NAME, CLibrary.class);
和Java:
public interface CLibrary extends Library {
public static final String JNA_LIBRARY_NAME = "test";
public static final NativeLibrary JNA_NATIVE_LIB = NativeLibrary.getInstance(CLibrary.JNA_LIBRARY_NAME);
public static final CLibrary INSTANCE = (CLibrary)Native.loadLibrary(CLibrary.JNA_LIBRARY_NAME, CLibrary.class);
public static class mystruct extends Structure {
public int n;
public FloatByReference Weights;
protected List<? > getFieldOrder() {
return Arrays.asList("n", "Weights");
}
public mystruct(int n, JnaeratorTestLibrary.feature_t.ByReference Features, FloatByReference Weights) {
super();
this.n = n;
this.Features = Features;
this.Weights = Weights;
}
public mystruct(Pointer peer) {
super(peer);
}
public static class ByReference extends mystruct implements Structure.ByReference {
};
public static class ByValue extends mystruct implements Structure.ByValue {
};
};
void testfunc(CLibrary.mystruct mys);
}
public static void main(String[] args) {
mystruct mys = new mystruct();
mys.n = 10;
mys.Weights = new FloatByReference();
// Compile error raises.
mys.Weights = new float[4]; mys.Weights[0] = 1.0;
testfunc(mys);
}
編譯錯誤消息:
類型不匹配:無法從float []轉換為FloatByReference
使用Pointer
,然后使用Pointer.getFloatArray(0, n)
提取所需的數據。
您需要分配Memory
並使用Memory.write()
將Java基本浮點數組寫入本機內存,然后再將該內存分配給您的結構字段。
FloatByReference
基本上是指向一個已分配浮點的指針。 JNAerator根本無法分辨出指向單個浮點數的指針與指向浮點數的緩沖區的指針之間的區別(如果沒有其他上下文,人類也不會)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.