web-dev-qa-db-fra.com

erreur: l'opérande de base de '->' a un type de non-pointeur 'JNIEnv'

#include <stdio.h>
#include <jni.h>

 JNIEnv* create_vm() {
    JavaVM* jvm;
    JNIEnv* env;
    JavaVMInitArgs args;
    JavaVMOption options[1];

    /* There is a new JNI_VERSION_1_4, but it doesn't add anything for the purposes of our example. */
    args.version = JNI_VERSION_1_2;
    args.nOptions = 1;
    options[0].optionString = "-Djava.class.path=/home/test/workspace/pankajs/"
            "jikes/JikesRVMia32-linuxproduction/target/tests/stress/prototype/basic/classes";
    args.options = options;
    args.ignoreUnrecognized = JNI_FALSE;

    JNI_CreateJavaVM(&jvm, (void **)&env, &args);
    return env;
}

void invoke_class(JNIEnv* env) {
    jclass helloWorldClass;
    jmethodID mainMethod;
    jobjectArray applicationArgs;
    jstring applicationArg0;

    helloWorldClass = (*env)->FindClass(env, "/test/org/jikesrvm/basic/core/bytecode/TestSwitch");

    mainMethod = (*env)->GetStaticMethodID(env, helloWorldClass, "main", "([Ljava/lang/String;)V");

    applicationArgs = (*env)->NewObjectArray(env, 1, (*env)->FindClass(env, "Java/lang/String"), NULL);
    applicationArg0 = (*env)->NewStringUTF(env, "From-C-program");
    (*env)->SetObjectArrayElement(env, applicationArgs, 0, applicationArg0);

    (*env)->CallStaticVoidMethod(env, helloWorldClass, mainMethod, applicationArgs);
}


int main(int argc, char **argv) {
    JNIEnv* env = create_vm();
    invoke_class( env );
}

I am trying to learn how JVM is actually invoked from bootstrap C files.

J'ai trouvé cet exemple sur Internet et je suis confronté à des problèmes lors de son exécution.

Je suis correctement spécifier les commandes de construction pour autant que je sache,

  g++ -g -I /usr/lib/jvm/Java-6-Sun-1.6.0.26/include -I /usr/lib/jvm/Java-6-Sun-1.6.0.26/include/linux CallJVM.c

Mon intention est de l'exécuter en utilisant jikesrvm mais pour expérimenter cela, j'ai choiside travailler avec JVM . L'erreur que j'obtiens est la suivante:

CallJVM.c: In function ‘JNIEnv* create_vm()’:
CallJVM.c:14:4: warning: deprecated conversion from string constant to ‘char*’
CallJVM.c: In function ‘void invoke_class(JNIEnv*)’:
CallJVM.c:28:26: error: base operand of ‘->’ has non-pointer type ‘JNIEnv’
CallJVM.c:30:21: error: base operand of ‘->’ has non-pointer type ‘JNIEnv’
CallJVM.c:32:26: error: base operand of ‘->’ has non-pointer type ‘JNIEnv’
CallJVM.c:32:57: error: base operand of ‘->’ has non-pointer type ‘JNIEnv’
CallJVM.c:33:26: error: base operand of ‘->’ has non-pointer type ‘JNIEnv’
CallJVM.c:34:8: error: base operand of ‘->’ has non-pointer type ‘JNIEnv’
CallJVM.c:36:8: error: base operand of ‘->’ has non-pointer type ‘JNIEnv’

J'ai remarqué les différentes manières d'implémenter en C et C++ mais je pense que je l'écris correctement.

Edit: lors de la compilation avec gcc, je reçois 

undefined reference to `JNI_CreateJavaVM'

et c’est ce qui a été demandé dans Eclipse, mais j’ai pensé que mes configurations ne sont pas aptes. Lorsque j’utilise ctrl+click, il me faut également référencer jni.h, mais c’est pourquoi il manque une référence? mentionne spécifiquement mes dossiers sur include chemin.

30
Rorschach

J'ai remarqué les différentes manières d'implémenter en C et C++ mais je pense que je l'écris correctement.

Vous utilisez la variante C, mais compilez avec g++, qui appelle le compilateur C++ (même si votre fichier source a une extension .c).

Soit changer les variantes C comme

(*env)->FindClass(env, ...)

aux variantes C++, comme

env->FindClass(...)

ou basculez votre compilateur sur gcc pour compiler la source en tant que code C.

75
Andreas Fester

Je suis en train de contourner le travail trouvé sur d'autres SO posts .. J'ai utilisé directement ce code - "gcc -g -I /usr/lib/jvm/Java-6-Sun-1.6.0.26/include -I /usr/lib/jvm/Java-6-Sun-1.6.0.26/include/linux -L /usr/lib/jvm/Java-6-Sun-1.6.0.26/jre/lib/i386/server -ljvm CallJVM.c et a.out a été créé. Ensuite, je dois le lier à libjvm.so présent dans dossier du serveur comme mentionné dans le post.

Une très belle explication a été mise en place ici

0
Rorschach