2013-04-15 7 views
6

Javaで書かれたプログラムからC DLLをロードしています。 私は、この宣言をDLLからのメソッドのいずれかを呼び出すことができるようにしたい:変換void **同等のJava型へのポインタ

dll_function(const char* foo1, const char* foo2, const char* foo3, void** bar, size_t* bar2); 

は、どのように私はJavaで正しい型の引数を持つこのメソッドを呼び出すのですか?私は(理論的に)それをどのように呼び出すのかは知っていますが、Javaプログラムから "void **"と "size_t *"をどうやって渡すのか知りたいですか?基本的には、私は、ボイドとsize_tのための「同等タイプ」***は、Javaでが何であるかを知りたい...

私はポインタークラスを見つけましたが、それは仕事を得るために管理していたのですか? 多くのありがとう:)

+0

あなたはそうではありません。概念はマッピング可能ではありません。あなたは値がどのように使用され、「カンニング」されるかを理解しなければなりません。または、Cラッパーを記述します。 –

答えて

1

size_tは、メモリ内の変数のサイズに使用される整数です。あなたはJavaでunsigned longを使用して安全でなければなりません。

void*は、不明な型のオブジェクトへのポインタです。 This questionは、この件に関してかなり面白いです。 JavaではObjectがこの例では一般的に使用されていますが、どのように変換するのか分かりませんが、this questionが役に立ちます。

+0

Javaに 'unsigned long'はありません... –

+0

ああ、良い点。その場合、32ビットコードでは 'long'(64ビット符号付き整数)、または64ビットコードでは' BigInteger'です。それを考えれば、Javaコードで実際に何もしないでログを記録すると、Javaと母国語の間の変換が行われない限り、64ビットのアドレス指定にも長い時間がかかることがありますそれを悪用し、size_tのように再解析することができます。 – Alan

+1

私はJDKのソースコードを読んでいます。 'long'は、JDK自体に「ピアオブジェクト」を格納するために使用されます(AWTObjectを検索し、興味があれば' pData'ポインタを探します)。 Androidソースも同じ目的で 'long'を使います。だから私は '長い'を使うのがベストプラクティスだと思う。 –

1

私は数年前にJava/JNI/Cプロジェクトに取り組みました。私は、Javaオブジェクト内に不透明なCポインタを保持しなければなりませんでした。 Java側でlongの値を使用して、JNI側でjlongからvoid*に変換されたCポインタ、または必要なポインタタイプを保持します。

Javaのlongタイプは64ビット幅で、JNI/Cポインタは通常32ビットまたは64ビットのいずれかの幅であるため、これらの間で変換に問題はありませんでした。

0

私はあなたのソリューションを試してみましたが、私は私は本当に正しく理解していなかったと思います... しかし、私はこの使用して私の問題を解決:私は私のJavaプログラムの中にそのようなC関数を呼び出し

import com.sun.jna.ptr.IntByReference; 

を:

IntByReference myVoidPointerPointer = new IntByReference(); 
myCLibrary.myCFunction(myVoidPointerPointer); 

C機能 "myCFunctionは" 次のようになります。

void myCFunction(void** parameter); 

これは問題ありませんか?それは働いていますが、それが正しい方法であるかどうか疑問に思っていました。

関連する問題