2010-11-27 6 views
7

JNAからこのメソッドシグネチャを持つメソッドをC言語で呼び出すにはどうすればよいですか? C法のJavaで新しいポインタを取得するには?

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

最後の2行のようになります。

*dev = pdev; 
return 0; 

その方法でdevの使用のみです。これは、メソッドの空のポインタにpoinerを渡す必要があることを意味します。この方法では、空のポインタをdeviceオブジェクトのアドレスで埋めるので、ポインタを他のメソッドに渡すことができます。

私の質問です:これは正しい方法ですか?そうであれば、どうすればJavaから新しいポインタを割り当てることができますか?


受け入れ答えに基づいて、私はこれをしなかった:

の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; 
+0

興味があるだけ:あなたのために更新されたコードの仕事をしましたか? '* p = p2'を設定しているように見えますが、C関数は' * p = pdev'を実行して値を上書きします。 – casablanca

+0

@casablanca:はい、私はそれをテストしました、それは動作します。 – thejh

+0

@thejh無効なメモリアドレスが指し示されているために作成されたinvalidMemoryAccess Exceptionを処理する方法を知っていますか? – mayooran

答えて

9

実際にネイティブオブジェクトを「割り当てる」ことJNA Pointerクラスは、複数の間接を可能にするためにsetPointergetPointerメソッドを持っているように見える、とMemoryクラス。だからあなたのようなものを行うことができる必要があります:

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 
+0

ああ、それは '新しいメモリ(Pointer.SIZE);'私が必要なもののように見える、ありがとう。 – thejh

0

あなたはメソッドに渡すときに、値によってそれらを渡すので、あなたは、参照を再割り当てすることはできません。すべてがJavaの価値によって渡されます。

あなたは、デバイスの新しいインスタンスをインスタンス化し、int型の代わりにそれを返すために、このメソッドを書き換えることができます。

+3

@duffymo:私はJNAポインタについて話していました:https://jna.dev.java.net/javadoc/com/sun/jna/Pointer.html – thejh

+0

これはJNAなしで行うことができます。 intの代わりにインスタンス化するDeviceオブジェクトに新しい参照を返すだけで済みます。 – duffymo

+2

@duffymo:そして明示的にネイティブなものを使わずにJavaを使ってCライブラリ(libbla.so)にアクセスするにはどうすればいいですか? – thejh

0

でも良い答え(私はJNAのドキュメントから推測しているが、私はこれをテストしていませんでした)。 Java Stringの長さに応じて(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)); 
} 
関連する問題