2013-05-31 92 views
8

我想熟悉JNI API,但無法獲得一個示例C++程序來編譯。未定義的引用'JNI_CreateJavaVM'linux

下面是我用來編譯的命令,下面是我正在編譯的程序。我得到的錯誤是:

/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_,否則它將無法在運行時找到該lib。

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

這應有助於:http://stackoverflow.com/questions/9923495 /未定義參考-SHM-開放已經添加-LRT-旗在這裏/ 9923523#9923523 – hmjd

回答

17

的方式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