- ベストアンサー
JNIを使用して、JAVAのメソッド実行結果の取得
JNIを使用して、VC6からJAVA(アプリケーション)のメソッドを起動して結果を構造体(複数件数)で受け取る事は可能ですか。 JAVAからデータの取得を方法について教えて下さい。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>VC6からJAVA(アプリケーション)のメソッドを起動 C言語側で、 ・JVMを起動 ・必要となるJAVAクラスのインスタンスを生成 ・必要なメソッドの実行 となります。 >結果を構造体(複数件数)で受け取る事は可能ですか JAVA側ではC言語の構造体を作ることは出来ません。 JAVAの結果は、JAVAのクラスの形式になります。 ですから、JAVAメソッドの結果をJAVAのクラスの形で受け取り、それをC言語の構造体に設定しなおすことになります。 アプリケーションで毎回それを全部行うのは大変なので、 JAVAの実行をラップするような関数なりをC言語で作るのがいいでしょう。
その他の回答 (1)
- 3rate-engineer
- ベストアンサー率45% (5/11)
>JAVAからデータの取得を方法について教えて下さい。 意味がわかりません。 人に質問するときの文章はきちんと読み直して誰が読んでもわかる状況にしてから書き込みましょう。 で、多分この辺を読めば実装できるでしょう http://java-house.jp/ml/archive/j-h-b/020899.html http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/jni/spec/intro.html
補足
回答ありがとうございます。 CプログラムからJNIにてJAVAのメソッドを実行して結果をCプログラム側で受け取る事をしたいです。メソッドの実行結果は構造体の為、この構造体をCプログラムで受け取りたいのです。 ※教えていただいた参照先を読んでみます。
補足
ご回答ありがとうございます。 返事が遅くなりましてすみませんです。 いろいろ調べてサンプルを作成して実行して みましたが、JAVAからの値が取れてきません。 以下にサンプルを記述します。 //javaのクラス--取得したいデータ格納 public class InfoData { java.lang.String Str1; long sCode; /** * InfoDataのコンストラクタ */ public InfoData() { Str1 = ""; sCode = 0; } } //Javaのクラス(Cアプリより呼ばれます) public class JniInfo { /* Creates new JniInfo コンストラクタ */ public JniInfo() { } public static void main(String[] args) { InfoData[] garray = null; garray = JniInfoPdf(); for(int i = 0 ; i < 1 ; i++){ System.out.println( "garray[i].Str1 = " + garray[i].Str1); System.out.println( "garray[i].sCode = " + garray[i].sCode); } } /** * @param args the command line arguments */ public static InfoData[] JniInfoPdf() { //初期設定 InfoData[] array = null; //データセット array = new InfoData[1]; for(int i = 0 ; i < 1 ; i++){ array[i] = new InfoData(); array[i].Str1 = "A"; array[i].sCode = 10; } System.out.println( "終了"); return array; } } //Cプログラム //これを実行してJAVAからデータを取得したいです) #include "windows.h" #include "jni.h" typedef struct _InfoData{ jstring Str1; jlong sCode; }InfoData, *PInfoData; int main(int argc, char* argv[]) { jint nResult = 0; JavaVM *jvm; // Java VM JNIEnv *env; JavaVMInitArgs vm_args; vm_args.version = JNI_VERSION_1_2; /* == 0x00010002 */ nResult = JNI_GetDefaultJavaVMInitArgs(&vm_args); if ( nResult == 0 ) { printf("Success vm.\n"); } else { printf("Fail vm.\n"); } JavaVMOption options[4]; options[0].optionString = "-Djava.compiler=NONE"; options[1].optionString = "-Djava.class.path = ."; //EXEと同位置 options[2].optionString = "-Djava.library.path = C:\\jdk1.3.1_16\\lib"; options[3].optionString = "-verbose:jni"; vm_args.version = JNI_VERSION_1_2; vm_args.options = options; vm_args.nOptions = 3; vm_args.ignoreUnrecognized = true; // VMを作成する。 nResult = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); if ( nResult == 0 ) { printf("Success to create vm.\n"); } else { printf("Fail to create vm. [%ld]\n", nResult); return 0; } // クラスをロードする。 jclass jcTarget = env->FindClass("JniInfo"); if ( jcTarget == NULL ) { printf("'JniInfo' class could not find.\n"); jvm->DestroyJavaVM(); return 0; } // 呼び出しメソッド(static メソッド)を取得する。 jmethodID mid = env->GetStaticMethodID(jcTarget, "JniInfoPdf", "()[LInfoData;"); if ( mid == NULL ) { printf("JniInfoPdf method could not find.\n"); jvm->DestroyJavaVM(); return 0; } // Javaコードのメソッドを実行する。 PInfoData garry; garry = (InfoData *)env->CallStaticObjectMethod(jcTarget, mid); for(int i = 0 ; i < 1 ; i++){ jobject jobj = env->GetObjectArrayElement((jobjectArray)garry, i); jclass jcls = env->GetObjectClass(jobj); jfieldID jfid = env->GetStaticFieldID(jcls, "Str1", "Ljava/lang/String;"); //(1) jfieldID jfid2 = env->GetStaticFieldID(jcls, "sCode", "J"); //(2) jchar x1 = env->GetCharField((jobjectArray)garry, jfid); // (3) jlong x2 = env->GetIntField((jobjectArray)garry, jfid2); // (4) } // VM の解放。 jvm->DestroyJavaVM(); return 0; } このCのプログラムをデバックで実行すると、(1)(2)の jfid,jfid2は0x00・・0となり、(3)(4)のx1,x2は共に1と なりデータが取得できません。 何が原因でしょうか。