1

私が間違っていなければ、JNA 構造体は、対応する Java クラスのパブリック フィールドに依存して構造体を構築しますStructure。私の問題は、宣言が事前にわかっていない構造体を渡す必要があることです(実行時にわかっているとしましょう)。ObjectCライブラリが(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
 }
4

2 に答える 2

0

引き続きご利用いただけますStructure。次のようにインターフェイス メソッドを定義します。

interface SomeLib {
    public static final SomeLib INSTANCE =
        (SomeLib) Native.loadLibrary("SomeLib", SomeLib.class);

    Pointer getSomeStruct();
}

次に、それを呼び出すときは、次のようにします。

Pointer someValue = SomeLib.INSTANCE.getSomeStruct();
// do something here to determine what type it is
SpecificStructure struct = new SpecificStructure(someValue);
于 2014-01-16T03:34:19.737 に答える
0

構造体の内容がわからない場合、それは「不透明」と呼ばれます。

opaqueの場合、構造アドレスを表すためにstruct *使用できます。com.sun.jna.Pointer

于 2013-08-01T16:59:56.153 に答える