27

Javaオブジェクト内にネイティブポインタを格納する「正しい」方法は何ですか?

intネイティブ ポインターのサイズが 32 ビット以下であることがわかっている場合はポインターを Java として扱い、ネイティブ ポインターのサイズlongが 64 ビット以下であることがわかっている場合は Java として扱うことができます。しかし、これを行うためのより良い、またはよりクリーンな方法はありますか?

編集:JNI関数からネイティブポインターを返すことは、まさに私がやりたくないことです。むしろ、ネイティブ リソースを表す Java オブジェクトを返したいと思います。ただし、私が返す Java オブジェクトにはおそらくポインターを含むフィールドが必要であり、元の質問に戻ります。

または、代わりに、JNI 関数がネイティブ リソースへの参照を返すためのより良い方法はありますか?

4

6 に答える 6

24

IIRC、両方java.util.zipjava.nioただ使用しますlong

于 2008-12-03T14:47:52.023 に答える
3

良い方法はありません。SWTでは、次のコードが使用されます。

int /*long*/ hModule = OS.GetLibraryHandle ();

コメントを移動してコードを32ビットから64ビットに変換するツールがあります。醜いですが、動作します。Sunがオブジェクト「NativePointer」などを追加していれば、事態ははるかに簡単になりましたが、追加しませんでした。

于 2008-12-03T14:49:16.310 に答える
2

そもそもネイティブ ポインターはあまり Java 風ではないため、バイト配列に格納することをお勧めします。ints とlongs は、数値を格納するために予約する方が適切です。

于 2008-12-03T14:32:18.327 に答える
2

これは、いくつかの JNI コードから返されたポインターであると想定してます。

理想的には、JNI コードは、実際のポインターではなく、リソースへのある種の論理参照を返す必要がありますか?

あなたの質問に関しては、ポインターを格納するためのよりクリーンな方法について頭に浮かぶことは何もありません-必要に応じて int または long または byte[] のいずれかを使用していることがわかっている場合。

于 2008-12-03T14:32:46.110 に答える
1

C# が IntPtr 型でこれを処理する方法を調べることができます。ポインターを保持するための独自の型を作成することにより、使用しているシステムに応じて、同じ型を 32 ビットまたは 64 ビットとして使用できます。

于 2008-12-03T14:41:33.970 に答える