001
21.09.2004, 11:54 Uhr
virtual
Sexiest Bit alive (Operator)
|
Das schlüsselwort lautet JNI, einen anderen Weg gibt es nicht.
Das kann man nicht in fünf Sätzen erklären, aber das sollte ein guter Einstieg in die Materie beiten: http://java.sun.com/j2se/1.3/docs/guide/jni/spec/jniTOC.doc.html
Ein kleines Beispiel:
Code: |
public class Hello { public static void main(String[] args) { System.out.println("Hallo JRockit: "+args[0]); } }
|
Sei eine kleine Java Klasse. Um die main Method aufzurufen, mußt du eine JVM iniitialisieren und dann die Klasse sowie die Methode finden und Aufrufen:
C++: |
#include "jni.h" #include <stdio.h> #include <stdlib.h>
void jnicall() { JNIEnv *env; JavaVM *jvm; jint res; jclass cls; jmethodID mid; jstring jstr; jclass stringClass; jobjectArray args; JavaVMInitArgs vm_args; JavaVMOption options[1]; options[0].optionString = "-Djava.class.path=."; vm_args.version = 0x00010002; vm_args.options = options; vm_args.nOptions = 1; vm_args.ignoreUnrecognized = JNI_TRUE; res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); if (res < 0) { fprintf(stderr, "Can't create Java VM\n"); exit(1); } cls = env->FindClass("Hello"); if (cls == NULL) { goto destroy; } mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V"); if (mid == NULL) { goto destroy; } jstr = env->NewStringUTF(" from C!"); if (jstr == NULL) { goto destroy; } stringClass = env->FindClass("java/lang/String"); args = env->NewObjectArray(1, stringClass, jstr); if (args == NULL) { goto destroy; } env->CallStaticVoidMethod(cls, mid, args); destroy: if (env->ExceptionOccurred()) { env->ExceptionDescribe(); } jvm->DestroyJavaVM(); }
int main() { jnicall(); }
|
Der erforderliche Header jni.h sollte bei dem JDK dabei liegen. Aber insges: -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |