1. ホーム
  2. アンドロイド

エラー: '->' のベースオペランドがポインタでない 'JNIEnv' 型である。

2022-02-25 08:13:22

から取得した。 error: '->' のベースオペランドが非ポインタ型 'JNIEnv' である。


質問です。

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

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

    /* Es gibt eine neue JNI_VERSION_1_4, die aber für die Zwecke unseres Beispiels nichts beiträgt. */
    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 halloWeltKlasse;
    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 );
}

Ich versuche zu lernen, wie die JVM tatsächlich von Bootstrap-C-Dateien aufgerufen wird.

私はインターネットでこの例を見つけましたが、実行中にいくつかの問題に直面しています。

私が知っている限りでは、ビルドコマンドを適切に指定しているのですが。

  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

私の意図は、実際にjikesrvmを使って実行することですが、これを実験するために、私はJVMで動作することを選択しました。私が取得しているエラーは、:

CallJVM.c: In der Funktion 'JNIEnv* create_vm()':
CallJVM.c:14:4: warning: deprecated conversion from string constant to 'char*'
CallJVM.c: In Funktion 'void invoke_class(JNIEnv*)':
CallJVM.c:28:26: Fehler: Basisoperand von '->' hat Nicht-Zeiger-Typ 'JNIEnv'
CallJVM.c:30:21: Fehler: Basisoperand von '->' hat Nicht-Zeiger-Typ 'JNIEnv'
CallJVM.c:32:26: Fehler: Basisoperand von '->' hat Nicht-Zeiger-Typ 'JNIEnv'
CallJVM.c:32:57: Fehler: Basisoperand von '->' hat Nicht-Zeiger-Typ 'JNIEnv'
CallJVM.c:33:26: Fehler: Basisoperand von '->' hat Nicht-Zeiger-Typ 'JNIEnv'
CallJVM.c:34:8: Fehler: Basisoperand von '->' hat Nicht-Zeiger-Typ 'JNIEnv'
CallJVM.c:36:8: Fehler: Basisoperand von '->' hat Nicht-Zeiger-Typ 'JNIEnv'

CとC++で実装の仕方が違うことに気づきましたが、正しく書けているつもりです。

編集:gccでコンパイルすると、次のようになります。

undefinierter Verweis auf `JNI_CreateJavaVM'

で、eclipseでプロンプトが表示されていたものですが、私の設定が適切でないのでは? ctrl+klick. を使用する場合

.
C