• ベストアンサー

JNIを使用して、JAVAのメソッド実行結果の取得

JNIを使用して、VC6からJAVA(アプリケーション)のメソッドを起動して結果を構造体(複数件数)で受け取る事は可能ですか。 JAVAからデータの取得を方法について教えて下さい。

  • jnet
  • お礼率0% (0/2)
  • Java
  • 回答数2
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.2

>VC6からJAVA(アプリケーション)のメソッドを起動 C言語側で、 ・JVMを起動 ・必要となるJAVAクラスのインスタンスを生成 ・必要なメソッドの実行 となります。 >結果を構造体(複数件数)で受け取る事は可能ですか JAVA側ではC言語の構造体を作ることは出来ません。 JAVAの結果は、JAVAのクラスの形式になります。 ですから、JAVAメソッドの結果をJAVAのクラスの形で受け取り、それをC言語の構造体に設定しなおすことになります。 アプリケーションで毎回それを全部行うのは大変なので、 JAVAの実行をラップするような関数なりをC言語で作るのがいいでしょう。

jnet
質問者

補足

ご回答ありがとうございます。 返事が遅くなりましてすみませんです。 いろいろ調べてサンプルを作成して実行して みましたが、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と なりデータが取得できません。 何が原因でしょうか。

その他の回答 (1)

回答No.1

>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

jnet
質問者

補足

回答ありがとうございます。 CプログラムからJNIにてJAVAのメソッドを実行して結果をCプログラム側で受け取る事をしたいです。メソッドの実行結果は構造体の為、この構造体をCプログラムで受け取りたいのです。 ※教えていただいた参照先を読んでみます。

関連するQ&A

  • Java JNI C++リンク dll読み込まない

    お世話になっております 何度も質問して申し訳ないですが、わかる方いらっしゃれば ご回答よろしくお願いいたします。 現在JavaでJNIを使用し、呼び出したC++からハードウェアへ 接続するというプログラムを開発しております。 その際、C++をdll形式にして、そのdllをJavaで呼び出すような形なのですが 私が使用しているコンピュータ(Windows 7)では、ハードウェアへの接続ができています。 コマンドを送信し、レスポンスを取得し、Javaのプログラムで表示ができます。 しかし、別のコンピュータ(Windows XP)で、開発したプログラムを実行すると dllを読み込む時点で下記のエラーが出てしまいます。 java.lang.UnsatisfiedLinkError: no JNI001 in java.library.path JNI001がC++で作成したdllです。 JNI001.dllは、実行したプログラムと同じフォルダにありますので、おかしいなと思いまして C:\Windows へ入れてみても結果は変わりません。 私が使っていたコンピュータのeclipseをまるまるコピーして実行しても効果なし。 環境変数も私のコンピュータとほとんど変わりません。 XPのJavaをインストールし直しても変わりません。 フォルダ階層やフォルダ名などチェックしましたが、7とXPで変わった点もないように思います。 そこで、少し気になったのですが、 現在開発中のプログラムは Java → JNI001.dll → ○○.dll → ハードウェア ○○.dllはハードウェアを動かすためのdllです。 上記の仕様に問題があるのでしょうか。 それでは私のコンピュータで接続できている理由がわからなくなりますが ・・・もう、なにもわかりません どうか、ご教授宜しくお願い致します。

  • JavaとObjective-c間でJNIエラー

    JavaとObjective-c間でJNIを使用してGUIのアプリケーション連携を行いたいのですが エラーになってしまいます。 アプリケーションの起動をNSApplicationMain関数を使用してしようとしてるのですが、 JNIの関数では使用できないのでしょうか? 一部抜粋ですが、以下のように呼び出しています。 また、このように連携を行いたい場合、どのようにするべきでしょうか? ご教授ください。 JNIEXPORT void JNICALL Java_JniApp_start (JNIEnv *env, jobject this) { int argc = 0; char *argv[0]; NSApplicationMain(argc, (const char**)argv); } こちらをJava側で呼び出すとエラーとなります。 エラー内容は以下になります。 java[1646:1303] No Info.plist file in application bundle or no NSPrincipalClass in the Info.plist file, exiting

  • JavaからJNIを使わず既存DLLを呼び出す

    現在、GeneXusというジェネレータで出力されたJavaコードを、GeneXusが使用しているフレームワークに依存しない形で解体する作業を行っております。 作業を進めていくうちに、こちらのシステムの内部にwin32DLLを呼び出している箇所があることに気づきました。 DLLの内部の処理がかなり重要な処理なのですが、現状どうにも手を出せない状態です。 JNIを使用してソースからDLLをコンパイルしなおせばUnsatisfiedLinkErrorを回避できることが分かったのですが、DLLのソースがないのでJNIでヘッダ情報などを生成することができない状況です。 ちなみに、DLLはとあるpackageからコールされており、そのpackageからなら問題なくコールできるようです。しかし私が新たに作成したコードから呼び出すと、やはりUnsatisfiedLinkErrorで「nativeメソッドが見つかりません」と言われます。 どうにか、既存のDLLをJavaから呼び出す方法はないでしょうか? もしくは、DLLの内部の処理を解析する方法はないでしょうか。 完全に行き詰っておりますので、何か案があればよろしくお願いいたします。

  • jspで、javaファイルmethodの使用

    複数のjspファイルの中でで、あるメソッドを使っているのですが、 同じメソッドなのにも関わらず、現在は毎回それぞれのjspに下記のように書いています。 <%! public String method() { ..... } %> 今のやり方ではメソッド修正しようとすると、全てのjspファイルのメソッドを修正しなければならず手間がかかってしまいます。 【質問】 1つのjavaファイルにまとめてmethodを書いて、jspでそれを呼び出せたら便利だと思うのですが、 そのような方法はあるのでしょうか?

    • ベストアンサー
    • Java
  • Javaのメソッドについて

    Javaの参考書を見ていて分からない点があります。 sampleクラスで使用したcurrentThreadメソッドは、 Thread.currentThread()と書いてもcurrentThread()と書いても 実行結果が同じになります。 Thread.と書かれた状態とThread.が書かれてない状態の違いはいったいなんでしょうか。 よろしくお願いいたします。

  • Javaでコマンドの結果の取得

    Javaでコマンドの結果を取得する方法ははありますか。 例えば、Hello Worldを実行してそれをStringに取得する方法をさがしています。 お願いします。

  • Runメソッドで実行したコマンドプロンプトの結果を1行ずつ取得する方法

    Runメソッドで実行したコマンドプロンプトの結果を1行ずつ取得する方法を教えてください。 pingの実行結果を1行ずつ取得したいのですがどうも上手く行きません。 Set WshShell = WScript.CreateObject("WScript.Shell") Set objWshScriptExec = WshShell.exec("ping 192.168.0.1") Set objStdOut = objWshScriptExec.StdOut strLine = objStdOut.ReadLine execメソッドを使用するのであればこんな感じで1行取得することが出来るかと思いますが、窓の非表示で同じことをやりたいので同じことをRunメソッドにて取得できればいう希望からの質問でした。 どうぞよろしくお願い致します。

  • 個々のメソッドの呼び出し時間を取得するには

    JAVAで内部で呼び出されてい個々のメソッドがどのぐらいの時間が かかったか取得する方法を教えてください。 VMのパラメータ等で調べられる簡単な方法はあるのでしょうか。

    • ベストアンサー
    • Java
  • oo4o。executeSQLにてupdate実行後、実行件数取得は?

    今まであまり使ったことの無かったAccess97のVBAを使用しています。単純な質問なんですが、教えてください。 oo4oにてオラクルDBに接続し、executeSQLメソッドにより単純なupdate処理を実行しました。 -----(細かいところは省略) sql= "update TABLE_A set CODE='AAA' where NAME='HOGE'" OraDB.ExecuteSQL sql ----- このExecuteSQLメソッドの、実行結果が0件なのか、1件なのかを知りたいのですが、方法はありますでしょうか?つまり、直前のSQLの実行結果を取得するメソッドはありますか?という質問です。Javaとかなら、戻り値として実行結果の件数が帰ってきますよね。この場合はそれをどうやって取ればいいのでしょうか? where NAME='HOGE'に当てはまるレコードが無くても、0件の処理が成功として、エラーは出ないんですよねぇ・・・ もし不足の情報がありましたら、補足いたします。 よろしくお願いします。

  • Java 実行できない

    こんにちは 約一年間Javaを勉強している者です。 使用しているOSはWindows 7です。 現在あるプログラムを作成していてFormを使ってPHPで値を取得するように、今回Formは使わないのですが同じようにJavaで値を取得しようとしています。 今までの知識ではできないと考えTomcatをインストールしServletを使用することにしました。 "JavaDrive"というサイトを見ながらインストール、設定を行いHelloWorld.javaをコンパイルし実行しようとしましたがうまくいきませんでした。 -----エラー内容--------------------------------------------------- exception in thread main java.lang.noclassdeffounderror: HelloWorld ----------------------------------------------------------------- サイトのプログラムをそのまま使用したのでプログラム自体に問題は無いと思います。 ネットで検索するとJavaとコンパイラのバージョンが違うとこのようなエラーが出るという人がいましたがそれも多分違うと思いますが一応バージョンを載せておきます。 Java - 1.6.0_29 Javac - 1.6.0 何か良い解決方法やServletを使わずにJavaでHTMLからデータを取得できる方法をご存知の方がいらっしゃいましたら教えてください。 よろしくお願いします。

専門家に質問してみよう