JVM mit C++



  • Hi zusammen,

    ich bastle seit geraumer Zeit an folgendem Problem: Ich benötige ein C++
    Programm, daß eine JVM erzeugt und mein JavaProgramm ausführt. Das Beispiel,
    daß ich im Netz gefunden habe ist von 2000 und funktioniert nicht. Ich werde
    aus dem C++ Quellcode ehrlich gesagt nicht ganz schlau. Zum Ausführen muss
    doch auf dem Rechner Minimum das JRE installiert sein. Die Umgebungsvariable
    JAVA_HOME ist gesetzt. Kann mir jemand sagen wo im Quellcode der Pfad zum
    SDK gelesen wird?
    Einzige Ursache, die ich sehe ist die Version, da das Beispiel wie gesagt
    von 2000 stammt. Ich benutze SDK 1.4.2.

    Danke für Eure Hilfe
    Matthias

    ----
    #include <jni.h>
    #include <stdlib.h>
    
    #define PATH_SEPARATOR ';'
    #define USER_CLASSPATH "." /* where Prog.class is */
    
    main() {
         JNIEnv *env;
         JavaVM *jvm;
         jint res;
         jclass cls;
         jmethodID mid;
         jstring jstr;
         jclass stringClass;
         jobjectArray args;
    
         JavaVMInitArgs vm_args;
         JavaVMOption options[1];
         options[0].optionString =
             "-Djava.class.path=" USER_CLASSPATH;
         vm_args.version = 0x00010002;
         vm_args.options = options;
         vm_args.nOptions = 1;
         vm_args.ignoreUnrecognized = JNI_TRUE;
    
         Hier tritt der Fehler auf!!!
         --> res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
    
         if (res < 0) {
             fprintf(stderr, "Can't create Java VM\n");
             exit(1);
         }
         cls = env->FindClass("Prog");
         if (cls == NULL) {
             goto destroy;
         }
    
         mid = env->GetStaticMethodID(cls, "main",
                                         "([Ljava/lang/StringV");
    
         if (mid == NULL) {
             goto destroy;
         }
         jstr = env->NewStringUTF(" from C!");
         if (jstr == NULL) {
             goto destroy;
         }
         stringClass = env->FindClass("java/lang/String");
         args = env->NewObjectArray(1, stringClass, jstr);
         if (args == NULL) {
             goto destroy;
         }
         env->CallStaticVoidMethod(cls, mid, args);
    
     destroy:
         if (env->ExceptionOccurred()) {
             env->ExceptionDescribe();
         }
         jvm->DestroyJavaVM();
     }
    
    ----
    

    Invoke.obj : error LNK2001: Nichtaufgeloestes externes Symbol
    __imp__JNI_CreateJavaVM@12
    Debug/Invoke.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
    Fehler beim Ausführen von link.exe.

    /edit: sfds



  • Sieht so aus, als müsstest du noch eine Library dazulinken.
    Das und die anderen Fragen haben aber nichts mit Standard C++ zu tun.



  • Dieser Thread wurde von Moderator/in davie aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • du machst da oben native code. in java kann man betriebssystemabhängigen code mit c hinzufügen..
    http://www.informatik.fh-muenchen.de/~schieder/seminar-java-ss98/jni/jni_aufbau.html#top_of_page
    schau dir diesen link mal an.

    du musst einen bestimmten aufbau haben, eine reihenfolge. java bietet dafür die schnittstelle, jni. halte dich an die reihenfolge, dann kann nix schiefgehen.



  • [quote="tommi"Kann mir jemand sagen wo im Quellcode der Pfad zum
    SDK gelesen wird?[/quote]
    Brauch' ja auch nicht...



  • @Sgt Nukem

    er hat ein wenig chaos veranstaltet mit dem aufmachen mehrerer threads..
    schreib mal hier weiter 😉
    http://www.c-plusplus.net/forum/viewtopic.php?p=478520#478520


Log in to reply