Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Nutzung von Java aus einer C++-Anwendung

&pagelevel(4)&pagelevel

Gegenüber der Nutzung von Java aus einer C-Anwendung (siehe Abschnitt „Nutzung von Java aus einer C-Anwendung") ergeben sich die folgenden Unterschiede:

Implementieren des C++-Codes

Die Datei Echo.cpp sei nun folgendermaßen implementiert:

#include <jni.h>
int
main(int argc, char *argv[])
{
   JavaVMInitArgs vm_args;
   JavaVMOption options[1];
   JavaVM *jvm;
   JNIEnv *env;
   jint res;
   jclass cls;
   jmethodID mid;
   jobjectArray args;
   int i;
   /*
   ** Prepare VM Options
   */
   options[0].optionString = "-Djava.class.path=.";
   /*
   ** Prepare VM configuration
   */
   vm_args.version = JNI_VERSION_1_4;
   vm_args.nOptions = 2;
   vm_args.options = options;
   vm_args.ignoreUnrecognized = JNI_FALSE;
   /*
   ** 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);
   }
   /*
   ** Get class Echo
   */
   cls = env->FindClass("Echo");
   if (cls == NULL)
   {
     fprintf(stderr,"Can't find Echo class\n");
     exit(1);
   }
   /*
   ** Get main method
   */
   mid = env->GetStaticMethodID(cls,"main",
                  "([Ljava/lang/String;)V");
   if (mid == 0)
   {
     fprintf(stderr,"Can't find main in Echo\n");
     exit(1);
   }
   /*
   ** Allocate argument array
   */
   args = env->NewObjectArray(argc-1,
                env->FindClass("java/lang/String"),NULL);
   if (args == 0)
   {
     fprintf(stderr,"Out of memory\n");
     exit(1);
   }
   /*
   ** Prepare arguments
   */
   for (i=1; i<argc; i++)
   {
     jstring jstr;
     jstr = env->NewStringUTF(argv[i]);
     if (jstr == NULL)
     {
        fprintf(stderr,"Out of memory\n");
        exit(1);
     }
     env->SetObjectArrayElement(args,i-1,jstr);
   }
   /*
   ** Call Java method
   */
   env->CallStaticVoidMethod(cls,mid,args);
   /*
   ** Destroy Java VM
   */
   (*jvm)->DestroyJavaVM(jvm);
   return 0;
}

Übersetzen der C++-Source

Die im vorigen Abschnitt implementierte C++-Source muss nun mit dem Kommando CC und den richtigen Compiler-Optionen übersetzt werden. Für Echo.cpp muss zusätzlich zu den Standard-Optionen, die weiter oben beschrieben wurden, noch der ASCII-Modus berücksichtigt werden. Außerdem wird in diesem Beispiel eine Anwendung produziert, die mit der X86-Variante von JENV auf SQ-Anlagen ablauffähig ist:

CC -c -I<Installations-Pfad>/include \
      -Kllm_keep,llm_case_lower \ 
      -Kworkspace_stack,c_names_unlimited \ 
      -Kliteral_encoding_ascii -Kno_integer_overflow 
      -D_SNI_THREAD_SUPPORT Echo.cpp

Binden und Ausführen der Anwendung

Beim Binden der Anwendung muss berücksichtigt werden, dass der X86-Laufzeit-Adapter von Java mit eingebunden wird und nicht die „normalen“ Laufzeitsysteme.

Mit den folgenden Kommandos kann die Anwendung gebunden werden:

export BLSLIB00='$.SKULNK.JENV.110.GREEN-JAVA' 

CC -Kno_link_stdlibs -B llm4 -o Echo \
      Echo.o -l BLSLIB

Das Programm kann dann wie jedes andere POSIX-Programm auf einer SQ-Anlage aufgerufen werden. Es benötigt zum Ablauf aber eine unter dem Standard-Installationspfad installierte X86-Variante von JENV. Für die Verwendung eines anderswo in- stallierten JENV muss die Umgebungsvariable JAVA_HOME entsprechend gesetzt werden (siehe Kapitel „Umgebungsvariablen").

Der Aufruf mittels

Echo Das ist ein Java-Echo

führt zu der erwarteten Ausgabe:

Das ist ein Java-Echo
export JENV_VMTYPE=client
Echo Das ist ein Java-Echo

Dies bewirkt, dass die HotSpot® Client-VM zur Ausführung verwendet wird.