2013-05-31 11 views
8

Próbuję zapoznać się z interfejsem API JNI, ale nie mogę pobrać przykładowego programu C++ do kompilacji.niezdefiniowane odwołanie do `JNI_CreateJavaVM 'linux

Oto polecenie, którego używam do kompilacji, a poniżej jest program, który próbuję skompilować. Błąd pojawia się:

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

kompilacji:

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(); 
} 

Rozglądałem się za ten problem i próbowałem każde rozwiązanie, jakie znaleziono, ale wciąż otrzymuję ten sam błąd ... Każda pomoc jest bardzo doceniana!

EDYCJA: Odpowiedź Joni's poniżej działa (w zależności od kompilatora). W przypadku, gdy ktoś inny znajdzie to: podczas uruchamiania skompilowanego wyjścia nie zapomnij o LD_LIBRARY_PATH = _path_to_your_libjvm.so_ lub nie będzie w stanie znaleźć tej biblioteki w środowisku wykonawczym.

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

To powinno pomóc: http://stackoverflow.com/questions/9923495/undefined-reference-shm-open-already-add-lrt-flag-here/9923523 # 9923523 – hmjd

Odpowiedz

17

Sposób GCC znajdzie symbole zmieniono dość niedawno: teraz jednostki mają być połączone są przetwarzane wyłącznie od strony lewej do prawej, a odniesienia do bibliotek (-lYourLibrary) są zignorowane, jeśli nic na lewo w linii poleceń potrzebuje ich.

Aby rozwiązać ten problem, należy przesunąć -ljvm po jednostek kompilacji, które go używają, na przykład do samego końca wiersza poleceń:

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 
Powiązane problemy