※ ChatGPTを利用し、要約された質問です(原文:C言語からjavaを呼び出したい)
C言語からJavaを呼び出す方法と設置場所についての質問
このQ&Aのポイント
C言語からJavaを呼び出す方法と設置場所について質問です。JNIを使用してC言語からJavaを呼び出しましたが、Javaのオブジェクトの設置場所が分かりません。
具体的には、1) クラスファイルのままでも良いのかjarにする必要があるのか、2) Javaモジュールをどこに設置すれば良いのか、が分からないです。
これまでの流れとしては、1) Javaソースを作成してコンパイルし、2) /etc/profileに環境変数を追加しました。さらに、3) C言語のソースをコンパイルしました。ただ、Javaモジュールの設置場所が分からないので困っています。
C言語からjavaを呼び出したいのでjniを使うことにしました。
各言語のソースはWebで見つけたサンプルを見ながら何とか作成し、各々コンパイルまで終わったのですが、javaのオブジェクト(?)をどこに置いたら良いのかさっぱりわかりません。
java使いの人達には常識の話だと思いますがjavaはサーブレットしか作ったことが無くどうしたものかと困っています。
分からないのは次の2点です。
1.classファイルのままでも良いのかjarにしないといけないのか?
2.どこに設置したら良いのか?
これまでやったこと
1.javaのソースを作成しコンパイルしました(classファイルのままです)
2./etc/profileに次のコマンドを追加しました。
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/java/jdk1.7.0_03/jre/lib/amd64/server
export LD_LIBRARY_PATH
3.C言語のソースを次のコマンドでコンパイルしました。
% gcc -I/usr/java/jdk1.7.0_03/include/ -I/usr/java/jdk1.7.0_03/include/linux -L/usr/java/jdk1.7.0_03/jre/lib/amd64/server -ljvm -lpthread jnitest.c -o jnitest
4.javaモジュールの設置←これがわかりません
初歩的な質問で申し訳ありませんがご教示下さい。
お礼
ご回答ありがとうございます。 まだできないのでもう少し教えて下さい。 printf("Start Jnitest\n"); JNIEnv *env; JavaVM *jvm; JNIEnv jni; JavaVM vmi; JavaVMInitArgs vm_args; JavaVMOption options[4]; printf("beginning execution...?n"); /* * /opt/blackdown-jdk-1.4.2/がJavaのルートディレクトリの場合 */ options[0].optionString = (char *) "-Djava.class.path=.:/usr/java/jdk1.7.0_03/jre/lib/rt.jar"; options[1].optionString = (char *) "-Djava.compiler=NONE"; vm_args.version = JNI_VERSION_1_4; vm_args.options = options; vm_args.nOptions = 2; vm_args.ignoreUnrecognized = JNI_FALSE; /* * JavaVMを初期化,起動する * JNIインターフェースへのポインタを返す */ JNI_CreateJavaVM(&jvm,(void **)&env,&vm_args); jni = *env; vmi = *jvm; /* * クラスをさがす */ jclass cls = jni->FindClass(env, "JniTest"); if (cls == 0) { printf("cannot found JniTest\n"); exit(1); } 上記のコードでjclass cls = jni->FindClass(env, "JniTest");が失敗するようです。(「cannot found JniTest」で終了します) JniTest.classはCの実行モジュールと同じパスに置きました。 # ll -rw-r--r-- 1 root root 609 4月 4 03:01 JniTest.class -rwxr-xr-x 1 root root 7737 4月 4 15:10 jnitest -rw-r--r-- 1 root root 1468 4月 4 15:08 jnitest.c クラスパスの設定方法が間違っているのでしょうか?