JNI-Verständnisproblem

swalbking

Mitglied
Hallo zusammen,
um eine JVM in C++ zu starten, bin ich auf folgende Codezeile gestoßen. Leider versteh ich sie nicht bzw. verstehe ich den Sinn der Zeile nicht:
Code:
typedef jint (WINAPI* JNI_CREATEJAVAVM)(JavaVM **pvm, void ** penv, void *args);

Und hier nochmal der Code im Zusammenhang:
Code:
#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:\\Programme\\Java\\jre1.5.0_07\\bin\\client\\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;
}

Gruß,
swalbking
 
Hallo zusammen,
um eine JVM in C++ zu starten, bin ich auf folgende Codezeile gestoßen. Leider versteh ich sie nicht bzw. verstehe ich den Sinn der Zeile nicht:
Code:
typedef jint (WINAPI* JNI_CREATEJAVAVM)(JavaVM **pvm, void ** penv, void *args);
Hierbei wird lediglich ein neuer Typ (bzw. Typ-Alias) vereinbart. Der neue Typ heißt JNI_CREATEJAVAVM und ist gleichbedeutend dem Typ "Zeiger auf Funktion mit der Argumentenliste (JavaVM **pvm, void **penv, void *args) und dem Rückgabetyp int".

D.h. eine Variable vom Typ JNI_CREATEJAVAVM kann auf eine Funktion mit folgender Signatur zeigen:
Code:
jint WINAPI eine_funktion(JavaVM **pvm, void ** penv, void *args);

JNI_CREATEJAVAVM funktions_zeiger = &eine_funktion;

eine_funktion(...); // Direktaufruf
(*funktions_zeiger)(...); // Aufruf über Zeiger.
Der Typ wird hier lediglich definiert für bessere Lesbarkeit.

PS: Wie in deinem Code zu sehen ist gibt es auch eine Kurzform beim Aufruf. Statt
Code:
(*funktions_zeiger)(...);
darf man auch
C:
funktions_zeiger(...);
verwenden.

Gruß
 
Zuletzt bearbeitet:
Zurück