Avatar billede clone Nybegynder
04. august 2005 - 15:05 Der er 4 kommentarer

JNI, Can't create Java VM

Jeg ønsker at kalde Java-kode fra et C-program.
Der findes et hav af eksempler på nettet, herunder en del på Sun's hjemmeside. Problemet er blot, at jeg ikke kan få dem til at virke. Jeg har prøvet med forskellige eksempler. Grundlæggende minder de fleste eksempler meget om hinanden... så noget kunne tyde på, at det er måden at gøre det på. Fx. http://java.sun.com/docs/books/tutorial/native1.1/invoking/invo.html

Min kode kompilerer perfekt i Visual Studio 6.0. Jeg husker at linke jvm.lib ind i koden, og stierne "$JAVA_HOME$\bin" og "$JAVA_HOME$\jre\bin\client" er sat op i min PATH-environment-variabel.

Når jeg kører mit program, fejler funktionen JNI_CreateJavaVM. Returværdi -1, som betyder, at den ikke kunne kreere en Java VM.

Jeg bruger Java v. j2sdk1.4.2_07.
Avatar billede arne_v Ekspert
04. august 2005 - 23:41 #1
jeg fik også fejl på invoke.c med 1.5.0
Avatar billede arne_v Ekspert
04. august 2005 - 23:43 #2
men så læste jeg http://java.sun.com/j2se/1.4.2/docs/guide/jni/jni-12.html#JNI_CreateJavaVM

og derefter så invoke.c ud som:

#include <jni.h>

int main() {
    JavaVMInitArgs vm_args;
    JavaVMOption options[4];
    JNIEnv *env;
    JavaVM *jvm;
    jint res;
    jclass cls;
    jmethodID mid;
    jstring jstr;
    jobjectArray args;

    options[0].optionString = "-Djava.compiler=NONE";
    options[1].optionString = "-Djava.class.path=.";
    options[2].optionString = "-Djava.library.path=.";
    options[3].optionString = "-verbose:jni";

    vm_args.version = JNI_VERSION_1_2;
    vm_args.options = options;
    vm_args.nOptions = 4;
    vm_args.ignoreUnrecognized = 1;

    res = JNI_CreateJavaVM(&jvm,(void **)&env,&vm_args);
    if (res < 0) {
        fprintf(stderr, "Can't create Java VM\n");
        exit(1);
    }

    cls = (*env)->FindClass(env, "Prog");
    if (cls == 0) {
        fprintf(stderr, "Can't find Prog class\n");
        exit(1);
    }

    mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");
    if (mid == 0) {
        fprintf(stderr, "Can't find Prog.main\n");
        exit(1);
    }

    jstr = (*env)->NewStringUTF(env, " from C!");
    if (jstr == 0) {
        fprintf(stderr, "Out of memory\n");
        exit(1);
    }
    args = (*env)->NewObjectArray(env, 1,
                        (*env)->FindClass(env, "java/lang/String"), jstr);
    if (args == 0) {
        fprintf(stderr, "Out of memory\n");
        exit(1);
    }
    (*env)->CallStaticVoidMethod(env, cls, mid, args);

    (*jvm)->DestroyJavaVM(jvm);
}

og med:

cl -IC:\SUNJava\jdk1.5.0\include -IC:\SUNJava\jdk1.5.0\include\win32 -MT invoke.c -link C:\SUNJava\jdk1.5.0\lib\jvm.lib
PATH=C:\SUNJava\jdk1.5.0\jre\bin\client;%PATH%

så virker det
Avatar billede arne_v Ekspert
04. august 2005 - 23:43 #3
PS: Jeg tror at du bliver træt af -verbose:jni !  :-)
Avatar billede clone Nybegynder
05. august 2005 - 13:22 #4
Tak for hjælpen. Jeg fandt dog ud af, at fejlen skyldtes, at jvm.lib-filen og jvm.dll ikke var samme version. Dooh!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester