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
Das Programm wird mit der in Abschnitt „Option zur Auswahl des HotSpot TM VM-Typs" im Abschnitt "java" beschriebenen Default-VM ausgeführt. Durch vorheriges Setzen der Umgebungsvariable JENV_VMTYPE kann der VM-Typ explizit bestimmt werden. Also z.B.:
export JENV_VMTYPE=client Echo Das ist ein Java-Echo
Dies bewirkt, dass die HotSpot® Client-VM zur Ausführung verwendet wird.