9

JNA から C でこのメソッド シグネチャを使用してメソッドを呼び出すにはどうすればよいですか?

int open_device(context *ctx, device **dev, int index);

C メソッドの最後の 2 行は次のようになります。

*dev = pdev;
return 0;

devそれがそのメソッドでの唯一の使用です。つまり、メソッドへの空のポインターにポインターを渡す必要がありますよね? 次に、メソッドは空のポインターにdeviceオブジェクトのアドレスを入力し、デバイスへのポインターを他のメソッドに渡すことができます。

私の質問は次のとおりです。これは正しい方法ですか?そうである場合、Java から新しいポインターを割り当てるにはどうすればよいですか?


受け入れられた答えに基づいて、私はこれをしました:

Memory p = new Memory(Pointer.SIZE);
Memory p2 = new Memory(Pointer.SIZE);
p.setPointer(0, p2);
nativeLib.open_device(ctx, p, index);
return p2;
4

3 に答える 3

9

JNAPointerクラスにはsetPointergetPointer複数の間接化を可能にするメソッドと、Memoryネイティブ オブジェクトを実際に「割り当てる」クラスがあるようです。したがって、次のようなことができるはずです:(JNAドキュメントから推測しているだけで、これはテストしていません)

Pointer pDev = new Memory(Pointer.SIZE); // allocate space to hold a pointer value
// pass pDev to open_device
Pointer dev = pDev.getPointer(0);        // retrieve pointer stored at pDev
于 2010-11-27T22:45:49.453 に答える
0

さらに良い答え。Java 文字列の長さに応じて割り当て (malloc など) が必要になる場合があります。以下の例は、JNA プロジェクトの単体テストです。

public void testGetSetStringWithDefaultEncoding() throws Exception {
    final String ENCODING = Native.DEFAULT_ENCODING;
    String VALUE = getName();
    int size = VALUE.getBytes(ENCODING).length+1;
    Memory m = new Memory(size);
    m.setString(0, VALUE);
    assertEquals("Wrong decoded value", VALUE, m.getString(0));
}
于 2015-11-22T11:26:21.737 に答える
-1

Java にはポインタはなく、参照のみです。

参照をメソッドに渡すときに参照を再割り当てすることはできません。これは、参照を値で渡すためです。Java ではすべてが値渡しされます。

このメソッドを書き直して、デバイスの新しいインスタンスをインスタンス化し、int の代わりにそれを返すことができます。

于 2010-11-27T22:35:02.983 に答える