1

私は JNI の初心者で、現在、この単純な C プログラムを使用して JVM を作成し、Java プロジェクトから main() を呼び出しています。

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

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

    args.version = JNI_VERSION_1_6;
    args.nOptions = 1;
    options[0].optionString = "-Djava.class.path=CLASSPATH"; //This isn't the actual classhpath, but you get the idea
    args.options = options;
    args.ignoreUnrecognized = JNI_FALSE;

    int ret = JNI_CreateJavaVM(&jvm, (void **)&env, &args);
    if (ret<0){
        printf("\nUnable to Launch JVM");
    } else {
        printf("\nJVM launched successfully");
    }
    return env;
}

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

    UncaughtExceptionClass = (*env)->FindClass(env, "exceptioncatcher/ExceptionCatcher");

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

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

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


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

これは、HelloWorld タイプの Java コードを実行するときにうまく機能しますが、私のコードは実際には Default Uncaught Exception Handler を設定します。このハンドラーは、キャッチされていない例外ごとに収集された情報をスレッドに送信します。スレッドはそれらを処理し、電子メールで送信します。

現在、これらは作成されたほとんどすべてのクラスであり、明らかに、現時点では多くのキャッチされていない例外をキャッチすることはありません。しかし、私はそれを試すために main() を使用します:

public static void main(String[] args){
    Thread.setDefaultUncaughtExceptionHandler(new DefaultExceptionHandler());
    Integer i = null;
    i++;
}

netbeans から実行するだけでは問題なく動作しますが、C アプリを使用すると「JVM が正常に起動しました」と表示されるだけです。

誰でもこれを手伝ってもらえますか?

4

1 に答える 1

0

最終的に機能させることができました(これまで質問を閉じたことはありませんでした)。単にプロジェクトをビルドし、クラスパスを生成された.jarに変更するだけでした。

于 2014-09-30T09:48:54.457 に答える