私が間違っていなければ、JNA 構造体は、対応する Java クラスのパブリック フィールドに依存して構造体を構築しますStructure
。私の問題は、宣言が事前にわかっていない構造体を渡す必要があることです(実行時にわかっているとしましょう)。Object
Cライブラリが(aへの参照)構造体として期待するsのリストを持っているだけです。このクラスを引き続き使用できますか、Structure
それともメモリ オブジェクトを手作業で構築し、サイズ、配置、パッキングを自分で処理する必要がありますか?
例えば:
/* native code */
typedef struct mystruct {
int x;
float y;
} mystruct;
void dosomething(mystruct * s) {
s->y += s->x;
}
そしてJavaでは:
...
callFunctionWithSt("dosomething",
new Object[]{Integer.valueOf(2),Float.valueOf(3.0)});
...
void callFunctionWithSt(String funcName, Object[] structVals) {
NativeLibrary nl = ...
Pointer arg = ... // or Memory ... or Structure
// build structure
for (Object objJava : structVals) {
valJna = convertFromJavaToJnaObject(objJava);
// fill structure
}
f.invoke(arg);
}
Object convertFromJavaToJnaObject(Object) {
// assume we know how to do this
}