jvm jni



  • moin,

    #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 = JNI_FALSE; 
    	JNI_CREATEJAVAVM JNI_CreateJavaVM = 0; 
    
    	HMODULE hLib = LoadLibrary(_T("D:/Programme/Java/jdk1.5.0_06/jre/bin/client/jvm.dll")); 
    
    	JNI_CreateJavaVM = (JNI_CREATEJAVAVM) GetProcAddress(hLib, "JNI_CreateJavaVM"); 
    	long status  = JNI_CreateJavaVM(&jvm, (void**) &env, &vm_args); 
    	jclass cls = (*env).FindClass("HelloWorld");
    	jmethodID mid = (*env).GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");
    	(*env).CallStaticVoidMethod(cls, mid,NULL);
    
    	jvm->DestroyJavaVM();
    	return 0; 
    }
    

    kann mir jemand den typedef erklähren?
    weil eigentlich sollte dieser aufruf genügen

    status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
    

    gibt allerdings fehler



  • Was für Fehler kommen denn?

    (eventuell solltest du mal überprüfen, ob die LoadLibrary() und GetProcAdress() Aufrufe erfolgreich waren, bevor du weiter arbeitest)



  • ne das programm funktioniert ich wollt nur wissen was das fürn typedef ist weil man braucht ja einen int in c auch nicht vorher definieren genauso eine prinf funktion ich kenn mich halt nicht so gut in c aus und wollt wissen was der typedef für ne bedeutung hat.



  • Dieser Thread wurde von Moderator/in HumeSikkins 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.



  • Der Typ ist ein Funktionszeiger - den verwendest du z.B., wenn du eine Funktion erst zur Laufzeit festlegen willst (in deinem Beispiel ist 'JNI_CreateVM' ein Zeiger auf eine Funktion, die einen JavaVM** und zwei void** nimmt und einen jint zurückliefert - und den biegst du auf eine Adresse in der DLL).



  • und warum steht da ein WINAPI davor? zu 1.) wenn ich das richtig verstanden habe muss der typedef gesetzt werden weil die funktion aus der jvm.dll erst zur laufzeit hinzugefügt wird.



  • nameac schrieb:

    und warum steht da ein WINAPI davor?

    Das dürfte die Aufrufkonvention sein (das sind Festelgungen, wie die Funktion ihre Parameter erhalten soll)

    zu 1.) wenn ich das richtig verstanden habe muss der typedef gesetzt werden weil die funktion aus der jvm.dll erst zur laufzeit hinzugefügt wird.

    Muß nicht - aber es erleichtert die Schreibweise. Du kannst auch den kompletten Typ stattdessen angeben, wenn du deinen Zeiger anlegst:

    jint (WINAPI* CreateVM)(JavaVM**,void**,void**) = (jint (WINAPI*)(JavaVM**,void**,void**)) GetProcAdress(hLib,"JNI_CreateJavaVM");
    

    (sieht schlimm aus, nicht wahr? und an der Stelle bin ich mir nichtmal sicher, ob ich die Klammern richtig gesetzt habe)


Anmelden zum Antworten