jni
-
nameac schrieb:
ne noch nich bin dabei sie hies jvm.dll und hilft bei linker fehlern weil da steht ja der nötige objectcode zur reference drin. ich meld mich fals geklappt hat.
Sie hilft aber trotzdem nicht bei Linkerfehlern, weil diese Referenzen erst zur Laufzeit aufgelöst werden ... und deshalb brauchst Du beim Linken trotzdem noch eine Lib, die dem Linker das mitteilt.
Oftmals ist das eine lib mit demselben Namen wie die DLL. Alternativ kannst Du Dir das auch selbst basteln, indem Du selbst (per "GetModul..()" o.ä. - WINAPI-Funtionen) die Calls kapselst ... aber das macht nicht wirklich Spaß.Gruß,
Simon2.
-
#include "stdafx.h" #include "jni.h" #include "windows.h" typedef jint (WINAPI* JNI_CREATEJAVAVM)(JavaVM **pvm, void ** penv, void *args); int main(int argc, char* argv[]) { JavaVMInitArgs vm_args; JavaVMOption options[10]; options[0].optionString = "-Djava.compiler=NONE"; options[1].optionString = "-Djava.class.path=."; vm_args.version = JNI_VERSION_1_4; vm_args.nOptions = 2; vm_args.options = options; vm_args.ignoreUnrecognized = false; JNI_CREATEJAVAVM JNI_CreateJavaVM = 0; HMODULE hLib = LoadLibrary("E:/c_progs/nativ_c/native_c/jvm.dll"); JavaVM* jvm; JNIEnv* env; JNI_CreateJavaVM = (JNI_CREATEJAVAVM) GetProcAddress(hLib, "JNI_CreateJavaVM"); long status = JNI_CreateJavaVM(&jvm, (void**) &env, &vm_args); if (status != JNI_OK) { printf("Failed creating JVM. Error: %d\r\n", status); } else { printf("JVM created\r\n"); } return 0; }fehlermeldung:
e:\c_progs\nativ_c\nativ_c\nativ_c.cpp(25) : error C2664: 'LoadLibraryW': Konvertierung des Parameters 1 von 'const char [36]' in 'LPCWSTR' nicht möglich
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
Das Buildprotokoll wurde unter "file://e:\c_progs\nativ_c\nativ_c\Debug\BuildLog.htm" gespeichert.
nativ_c - 1 Fehler, 0 Warnung(en)mit \\ hab ich es auch schon probiert

-
nameac schrieb:
e:\c_progs\nativ_c\nativ_c\nativ_c.cpp(25) : error C2664: 'LoadLibraryW': Konvertierung des Parameters 1 von 'const char [36]' in 'LPCWSTR' nicht möglich
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
Das Buildprotokoll wurde unter "file://e:\c_progs\nativ_c\nativ_c\Debug\BuildLog.htm" gespeichert.
nativ_c - 1 Fehler, 0 Warnung(en)Ein Wort: UNICODE (wenn du Google oder die Suchfunktion benutzt, erfährst du mehr zu dem Thema)
Als Lösung:
HMODULE hLib = LoadLibrary(_T("E:/c_progs/nativ_c/native_c/jvm.dll"));
-
jo danke

-
nochma,
#include "stdafx.h" #include "jni.h" #include "windows.h" typedef jint (WINAPI* JNI_CREATEJAVAVM)(JavaVM **pvm, void ** penv, void *args); int main(int argc, char* argv[]) { JavaVMInitArgs vm_args; JavaVMOption options[10]; JavaVM* jvm; JNIEnv* env; options[0].optionString = "-Djava.compiler=NONE"; options[1].optionString = "-Djava.class.path=D:/programme/eclipse/workspace/helloworld"; vm_args.version = JNI_VERSION_1_4; vm_args.nOptions = 2; vm_args.options = options; vm_args.ignoreUnrecognized = false; JNI_CREATEJAVAVM JNI_CreateJavaVM = 0; HMODULE hLib = LoadLibrary((LPCWSTR)"E:\\c_progs\\nativ_c\\native_c\\jvm.dll"); JNI_CreateJavaVM = (JNI_CREATEJAVAVM) GetProcAddress(hLib, "JNI_CreateJavaVM"); long status = JNI_CreateJavaVM(&jvm, (void**) &env, &vm_args); if (status != JNI_OK) { printf("Failed creating JVM. Error: %d\r\n", status); } else { printf("JVM created\r\n"); } jclass cls = (*env).FindClass("HelloWorld"); if (cls == 0) { fprintf(stderr, "Can't find Prog class\n"); } jmethodID mid = (*env).GetStaticMethodID (cls, "main", "([Ljava/lang/String;)V"); if (mid == 0) { fprintf(stderr, "Can't find Prog.main\n"); } (*env).CallStaticVoidMethod(cls, mid, NULL); (*jvm).DestroyJavaVM(); return 0; }compeliert fehler frei, jdoch beim ausführen der exe kommt ein fehler :
" die anweisung in 0x00000000 verweist auf speicher in 0x00000000. der vorgang read konnte nicht durchgeführt werden."

-
Hi,
schonmal überprüft, ob hLib und JNI_CreateJavaVM überhaupt gültige Werte haben ?
Vielleicht scheitern ja LoadLibrary() oder GetProcAddress() ? (z.B: File not found etc....)Gruß,
Simon2.
-
hm scheinst recht zuhaben ich hab mal soweit auskommentiert das nur noch das von dem post davor dasteht und beim ausführen der exe entsteht der gleiche fehler.
long status = JNI_CreateJavaVM(&jvm, (void**) &env, &vm_args);
der fehler scheint bei diesem aufruf zuentstehen das meinst du doch oder
wie testet man z.b. ob getProcAddress eine gültige addresse zurück gibt?
ich habe mal das probiertJNI_CreateJavaVM = (JNI_CREATEJAVAVM) GetProcAddress(hLib, "JNI_CreateJavaVM"); if(JNI_CreateJavaVM=NULL||JNI_CreateJavaVM!=NULL){ printf("fdgg"); }aber der if block wird nicht ausgeführt

-
if(JNI_CreateJavaVM==NULL) printf("Error");(Hint: = bedeutet Zuweisung, vergleichen tust du mit ==)
PS: Und am besten auch den Rückgabewert von LoadLibrary überprüfen.
PPS: (LPCWSTR)"..." ist etwas anderes als _T("...") (ersteres interpretiert den Inhalt des ASCII-Strings nur als UNICODE-Daten um, letzteres erzeugt einen UNICODE-String)
-
jo beides null was soll ich jetz machen ich hab das auch mit dem _T gemacht.
-
GetLastError() verwenden, um herauszufinden was schiefgelaufen ist
(btw, wenn du mit den Errorcodes nichts anfangen kannst, FormatMessage() kann dir erklären, was sie bedeuten)
-
if(hLib==NULL){ printf("%s",GetLastError()); }meinst du so da kommt beim ausführen der exe ein fehler:
die anweisung in 0x10227c2f verweist auf speicher in 0x0000007e der vorgang read konnte nicht durchgeführt werden.
-
Und lies dir bitte mal die Formatkennungen von printf() durch - GetLastError() liefert einen int-Wert, den kannst du als "%d" direkt ausgeben oder per FormatMessage() dir einen lesbaren String dazu besorgen.
-
Sorry für's OT, aber das ist wirklich mal ein schöner Vertipper:
nameac schrieb:
...
if(JNI_CreateJavaVM=NULL||JNI_CreateJavaVM!=NULL){...

Hier passiert Folgendes:
1.) JNI_CreateJavaVM wird auf NULL gesetzt; als "Ergebnis" dieser Zuweisung wird NULL (üblicherweise "0", als "false" interpretiert)
2.) Nachdem die erste Bedingung also "false" ergibt, wird die zweite ausgewertet.
3.) Da bei spätestens bei 1.) JNI_CreateJavaVM auf NULL gesetzt wurde, ergibt auch die zweite Bedingung "JNI_CreateJavaVM!=NULL" ein "false".
=> Anweisungsblock wird NIE ausgeführt.
Hat der Compiler das eigentlich gefunden ? ("unreachable statement" oder so)
Gruß,
Simon2.
-
sorry aber c/c++ muss ich erst noch lernen da bei deim link kein bsp gestellt ist versteh ich nur bla. der errorcode gibt 126 zurück
-
mit link meine ich den für formatmessage
-
nameac schrieb:
mit link meine ich den für formatmessage
BTW: Du kannst als "Registrierter" auch Deine Posts editieren, wenn Du noch was klarstellen willst.

Da steht:
" ....FORMAT_MESSAGE_FROM_SYSTEM
If this flag is specified, an application can pass the result of the GetLastError function to retrieve the message text for a system-defined error...."
Das Flag musst Du also setzen für Deinen Fall.Aber prinzipiell ist das, was Du vorhast, deutlich komplexer als das Verstehen der MSDN-Programmierhinweise .... ich vermute, dass Du Dich da letztlich doch reinfuchsen musst (selbst, wenn Du weißt, was der Fehler bedeutet, brauchst Du ja wieder eine Idee, wie Du ihn behebst ... und dann bekommst Du vermutlich den nächsten Fehler ...).
Gruß,
Simon2.
-
nameac schrieb:
sorry aber c/c++ muss ich erst noch lernen da bei deim link kein bsp gestellt ist versteh ich nur bla. der errorcode gibt 126 zurück
Dann solltest du mal etwas weiter nach unten scrollen, dort findest du:
MSDN schrieb:
For an example, see Retrieving the Last-Error Code.

-
kennt denn jemand von euch noch en code bsp. oder tutorial, zu diesem thema das auch funzt?
danke für den tipp mit dem editieren
printf("%s",FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM));meint ihr so das geht aber auch nich!
k hab jetz die tabellen gefunden und 126 steht für The specified module could not be found.
ok fehler behoben aber jetz kommt der fehler:
long status = JNI_CreateJavaVM(&jvm, (void**) &env, &vm_args); if (status != JNI_OK) { printf("Failed creating JVM. Error: %d\r\n", status); } else { printf("JVM created\r\n"); }status ist -1
-
Hier wird dir kaum jemand jede Einzelheit vorkauen. In der MSDN (die Seite habe ich obne genannt) kannst du auch den Links (blaue und unterstrichen) folgen, wenn du weitere Informationen suchst - unter anderem ist da auch ein Link zu 'nem Beispielcode (recht weit unten unter "Examples").PS: Welcher Aufruf verursacht denn diesen Fehler? "The specified module could not be found" deutet darauf hin, daß du dich bei einem Namen verschrieben hast.
-
k -1 heißt unknownerror
#include "stdafx.h" #include "jni.h" #include "windows.h" #include "Winbase.h" typedef jint (WINAPI* JNI_CREATEJAVAVM)(JavaVM **pvm, void ** penv, void *args); int main(int argc, char* argv[]) { JavaVMInitArgs vm_args; JavaVMOption options[10]; JavaVM* jvm; JNIEnv* env; options[0].optionString = "-Djava.compiler=NONE"; options[1].optionString = "-Djava.class.path=D:/programme/eclipse/workspace/helloworld"; vm_args.version = JNI_VERSION_1_4; vm_args.nOptions = 2; vm_args.options = options; vm_args.ignoreUnrecognized = false; JNI_CREATEJAVAVM JNI_CreateJavaVM = 0; HMODULE hLib = LoadLibrary(_T("E:/c_progs/nativ_c/nativ_c/jvm.dll")); if(hLib==NULL){ printf("%d",GetLastError()); } JNI_CreateJavaVM = (JNI_CREATEJAVAVM) GetProcAddress(hLib, "JNI_CreateJavaVM"); if(JNI_CreateJavaVM==NULL){ printf("%d",GetLastError()); } long status = JNI_CreateJavaVM(&jvm, (void**) &env, &vm_args); if (status != JNI_OK) { printf("Failed creating JVM. Error: %d\r\n", status); } else { printf("JVM created\r\n"); } return 0; }und dieser anleitung bin ich gefolgt
http://forum.javacore.de/viewtopic.php?t=3879&view=previous&sid=91b0245e49c22b1c58ba0a601085e7dd
findet einer von euch nen unterschied zu dem was ich gepostet hab weil ich krieg immer noch ne -1
