9

JNI API に慣れようとしていますが、サンプルの C++ プログラムをコンパイルすることができません。

これがコンパイルに使用しているコマンドで、その下にコンパイルしようとしているプログラムがあります。私が得るエラーは次のとおりです。

/tmp/cczyqqyL.o: In function `main':
/home/nc/Desktop/jni/simple/ctojava/callJava.cpp:16: undefined reference to `JNI_CreateJavaVM'

コンパイル:

g++ -g -I/usr/lib/jvm/java-7-oracle/include/ -I/usr/lib/jvm/java-7-oracle/include/linux/ -L/usr/bin/java -L/usr/lib/jvm/java-7-oracle/jre/lib/amd64/server/ -ljvm callJava.cpp

C++:

#include <jni.h> /* where everything is defined */

int main(){
    JavaVM *jvm; /* denotes a Java VM */
    JNIEnv *env; /* pointer to native method interface */

   JavaVMInitArgs vm_args;
   JavaVMOption options[1];
   options[0].optionString = "-Djava.class.path=/home/nc/Desktop/jni/simple/ctojava/";
   vm_args.version = JNI_VERSION_1_6;
   vm_args.options = options;
   vm_args.nOptions = 1;
   vm_args.ignoreUnrecognized = JNI_FALSE;

   /* Create the Java VM */
   int res = JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args); // this is what it can't find

   /* invoke the Main.test method using the JNI */
   jclass cls = env->FindClass("Hello");
   jmethodID mid = env->GetStaticMethodID(cls, "staticInt", "(I)I");
   env->CallStaticVoidMethod(cls, mid,10);

   /* We are done. */
   jvm->DestroyJavaVM();
}

この問題を検索し、見つけたすべての解決策を試しましたが、それでも同じエラーが発生します...どんな助けも大歓迎です!

編集:以下のジョニの答えは機能します(コンパイラによって異なります)。他の誰かがこれを見つけた場合: コンパイルされた出力を実行するときに LD_LIBRARY_PATH=_path_to_your_libjvm.so_ を忘れないでください。そうしないと、実行時にそのライブラリを見つけることができなくなります。

LD_LIBRARY_PATH=/usr/lib/jvm/java-7-oracle/jre/lib/amd64/server ./a.out
4

1 に答える 1

25

GCC がシンボルを見つける方法はかなり最近変更されました。現在、リンクされるユニットは厳密に左から右に処理され、ライブラリへの参照 ( -lYourLibrary) は、コマンド ラインの左側に必要なものがない場合、黙って無視されます。

これを修正する-ljvmには、それを使用するコンパイル ユニットの後、たとえばコマンド ラインの最後に移動します。

g++ -g -I/usr/lib/jvm/java-7-oracle/include/ -I/usr/lib/jvm/java-7-oracle/include/linux/ \
-L/usr/bin/java -L/usr/lib/jvm/java-7-oracle/jre/lib/amd64/server/ callJava.cpp -ljvm
于 2013-05-31T14:58:48.657 に答える