Nochmal JVM mit C++
-
Hallo nochmal,
ich beziehe mich nochmal auf mein vorheriges Posting:
http://www.c-plusplus.net/forum/viewtopic.php?t=67599Das geschilderte Problem mit dem Linker trat bei Visual C++ 5.0 auf. Ich weiss etwas veraltert. Genau deshalb habe ich auf das Visual C++ .NET aus dem Visual Studio .NET installiert. Dort allerdings lief nicht mal der Compiler durch. Bislang habe ich fast ausschließlich Java programmiert. Auch da gibts Änderungen zwischen den einzelnen SDK Versionen, aber was ist hier los???
Hier nur ein KLEINER Auszug aus den Fehlermeldungen:
error C2065: 'JNIEnv' : undeclared identifier
error C2296: '*' : illegal, left operand has type ''unknown-type''
error C2146: syntax error : missing ';' before identifier 'res'
error C2109: subscript requires array or pointer typeZur Erinnerung nochmal der Code
#include <jni.h> #include <stdlib.h> #include "stdafx.h" #define PATH_SEPARATOR ';' #define USER_CLASSPATH "." /* where Prog.class is */ int 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; /* Create the Java VM */ 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(); }
mfg und danke
tommi
-
1. mach doch bitte dafür keinen neuen thread auf!
2. bist du dir sicher, dass du alles richtig installiert hast? Schau dir mal den Header jni.h an und schau, ob da JNIEnv irgendwo deklariert wird.
-
hi
du hast deinen code sicherlich hierher..
http://java.sun.com/docs/books/tutorial/native1.1/invoking/invo.html
und da steht schon einiges von dem, was du machen musst.a.
includepfade legen, sonst findet er natürlich die jni.h nicht.ich habe sie dazugepackt:
unter windows mit dem studio:
E:\j2sdk1.4.2_03\include\win32,E:\j2sdk1.4.2_03\include
(mit assistenten mit komma trennen)danach dann die jvm.lib mitlinken.
compilieren geht dann, starten auch.. dann kommen folgeprobleme, aber ich weiß nicht so recht, wofür du das brauchst, dementsprechend hör ich an dieser stelle erstmal auf.
-
nur noch ein hinweis:
hier steht es ganz gut beschrieben
-
Hi elise,
und erstmal vielen Dank für Deine Hilfe. Das Programm lies sich jetzt vollständig kompilieren.
Leider ist noch irgendwo ein Fehler enthalten. Unter anderem auch Deinen Link habe ich beim Erstellen des Programmes verwendet.Beim Testen ist mir folgendes Aufgefallen:
#include <stdlib.h> #include "jni.h" #include "jni_md.h" #pragma comment(lib, "jvm.lib") int main() { JDK1_1InitArgs vm_args; status = JNI_GetDefaultJavaVMInitArgs(&vm_args); if ( status == 0 ) { printf("GetDefaultJavaVMInitArgs erfolgreich!\n"); getchar(); } else { printf("GetDefaultJavaVMInitArgs fehlgeschlagen: %d\n", status); getchar(); } }
Bereits hier erhalte ich den Rückgabewert -1. Steht laut Headerdatei für unknown error. Ganz toll
Ich habe die jni.h und jni_md.h, die beim SDK dabei sind in den Projektordner kopiert und includet und die jvm.lib (auch beim SDK enthalten) dazugelinkt.
Ausserdem wollte er noch die jvm.dll. Diese (wiederrum beim SDK dabei) habe ich noch in den Projektordner kopiert. Er findet auch alles. Ich weiss nicht woran es noch liegen könnte?Vielleicht hast Du ja noch eine Idee!?
mfg
tommi
-
hallo..
ich denke, ab diesem punkt muss ich aussteigen...
mir scheint, du willst aus java eine exe machen, oder?
zitat aus obigen link:
ava-Applikationen (nicht Applets!) kann man bekanntlich als selbständige Programme laufen lassen, indem man sie von der Kommandozeile startet mit
java MeineApplikation
Dies ist aber insbesondere in GUI-orientierten Betriebssystemen unpraktisch – es wäre schöner, wenn man dem Programm ein Icon verpassen und durch Doppelclick darauf das Programm starten könnte. (Nebenbemerkung: Ab Java 1.4 kann man dies tun, wenn man aus der Applikation ein JAR-File herstellt und dann auf das JAR-File-Icon doppelclickt. Näheres dazu aber nicht hier, sondern in der Java-Online-Dokumentation). Damit ein solcher Start möglich ist, muss das Programm aber ein .exe sein, d.h. ein Programm in maschinenausführbarem Code. Wir wollen daher in diesem letzten Abschnitt darstellen, wie man dies bewerkstelligen kann.
Als erstes stellen wir fest, dass ein Java-Programm nicht ohne JVM ablaufen kann: Wir müssen also zuerst eine JVM starten, bevor wir ihr das class-File übergeben können. Da eine JVM zu ihrem Ablauf Angaben über das WAS, WIE, WO der Java-Directories braucht, müssen wir ihr eine struct aufbauen, die diese Angaben enthält: JavaVMInitArgs. Die Deklaration dieser struct befindet sich in jni.h; wir müssen also nur deren Felder füllen:...
in der java faq steht noch ein beitrag zu "java und exe".
desweiteren rate ich dir, mal auf
www.javacore.de zu fragen. vielleicht hat da schon jemand die vm per jni gestartetso long
ps: ich fahre 1.4 und 1.5 ... ich bin mir nicht sicher, ob das mit diesen sdks noch so geht. dazu noch dieser beitrag:
http://www.java.de/forum/message/20218/
ich würde auch zum jar file tendieren...