• 締切済み

C++のDLLをJAVAで実行→うまく行かない。。

Java素人です。ちょっと教えてほしいです。 以下のC++は問題なく動作します。 //C++ヘッダの記述 VC_Header_API int _stdcall GET_DATA(UINT32* abcData, int* Count); //C++の記述 UINT32* abcData; abcData= (UINT32*)malloc(128 * 512 * 1024 * sizeof(UINT32)); int Count= 0; return= GET_DATA(abcData, &Count); //→ 正しい値が取れる。適当な数字の羅列データ しかしJavaでは、結果の戻り値が取れなくて。。。 //Javaの記述 (中略です) //C++ Function name int SET_DATA(int setData, byte[] Err); int GET_DATA(int[] abcData, int[] Count); byte[] Err = new byte[128]; int[] abcData= new int[100000]; int[] Count= new int[1000]; return = abcDLL.INSTANCE.GET_DATA(5555, Err); //→問題なく動作します。Errの文字コードも取れます。 return = abcDLL.INSTANCE.GET_DATA(abcData, Count); //→これを実行したとき、abcデータとCountがすべて”0”... 正しい値が入ってこないのは、abcData, Countの渡し方の問題だと思われるんですが。。。 他の関数は問題なく動作可能です。 問題ない渡し方、分かりますでしょうか?アドバイスいただきたいです。 よろしくお願いいたします。

みんなの回答

  • _kappe_
  • ベストアンサー率68% (1581/2304)
回答No.2

回答No.1の者です。 C++の関数をJavaから呼ぶにはJava Native Interface(JNI)という機能を使うのが古くからの方法でした。 https://ja.wikipedia.org/wiki/Java_Native_Interface 質問文にある情報だけではJNIを使っていないように見えますが、GET_DATA()メソッドの定義の中で使っているかもしれません。 最近のバージョンのJavaだとJNIとは別のやり方があります。 abcDLLやabcDLL.INSTANCEの型(クラス)は何なのか、その定義はどうなっているのかを知る必要があります。 念のための確認ですが、もしC++で書かれた関数のDLLファイルを削除した状態で問題のJavaプログラムを実行したらどのような結果になりますか。 DLLファイルが見つからないとUnsatisfiedLinkErrorが発生するはずです。

  • _kappe_
  • ベストアンサー率68% (1581/2304)
回答No.1

質問文にある情報だけでは答えるのは困難です。abcDLL.INSTANCE.GET_DATA()がどのように定義されているのかが一番の鍵だと思います。 >return = abcDLL.INSTANCE.GET_DATA(5555, Err); //→問題なく動作します。Errの文字コードも取れます。 Errの型はbyte[]で、intとbyte[]を引数に取るのはGET_DATA()ではなくSET_DATA()です。単純な書き間違いだろうと思いますが。 「Errの文字コードも取れます」というのも、質問文内に関係する情報が書かれていないので回答者にとっては残念ながら意味不明です。

関連するQ&A