3

jvm のロードに失敗した理由を説明するエラー メッセージを取得したいと考えています。ここに提供されている例から:

http://java.sun.com/docs/books/jni/html/invoke.html

この例を抽出しました:

 /* Create the Java VM */
 res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

 if (res < 0) {
     // retrieve verbose error here?
     fprintf(stderr, "Can't create Java VM\n");
     exit(1);
 }

私の特定のケースでは、vm_args に無効な引数を指定しており、コマンド ラインで「認識されないオプション: -foo=bar」と表示されることを期待しています。

さらにテストすると、jvm がメッセージ I want to stdout または stderr を出力しているように見えます。探しているエラーを取得するには、stdout と stderr をキャプチャする必要があると思います (もちろん、もっと簡単な方法がない限り)。私はC++でコーディングしているので、誰かがエラーを文字列ストリームにキャプチャする方法を示すことができれば理想的です。

ありがとう、ランディ

4

3 に答える 3

5

ここで説明されている「vfprintf」オプションを使用して、必要なものを取得できました。

https://web.archive.org/web/20111229234347/http://java.sun.com/products/jdk/faq/jnifaq-old.html

jdk1.2オプションを使用しましたが。このコード スニペットは、私のソリューションをまとめたものです。

static string jniErrors;

static jint JNICALL my_vfprintf(FILE *fp, const char *format, va_list args)
{
    char buf[1024];
    vsnprintf(buf, sizeof(buf), format, args);
    jniErrors += buf;
    return 0;
}

...

JavaVMOption options[1];
options[0].optionString = "vfprintf";
options[0].extraInfo = my_vfprintf;

JavaVMInitArgs vm_args;
memset(&vm_args, 0, sizeof(vm_args));
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.version = JNI_VERSION_1_4;
vm_args.ignoreUnrecognized = JNI_FALSE;

JNIEnv env;
JavaVM jvm;

jint res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

if (res != JNI_OK)
    setError(jniErrors);

jniErrors.clear();

また興味深いのは、私の人生では、freopen や dup2 のトリックを使って stdout や stderr を正しくキャプチャできなかったことです。自分のdllをロードして正しくリダイレ​​クトできましたが、jvmはできませんでした。とにかく、エラーをファイルではなくメモリに保存したかったので、この方法の方が優れています。

于 2009-04-29T19:51:10.780 に答える
0

とにかく必要な stdout と stderr を取得したら、jvm コマンドラインに -Xcheck:jni を追加して、jvm から追加の jni 関連の警告を取得します。

于 2009-04-28T23:55:19.737 に答える
0

このコードを書いたとき、stdout/stderr 経由でもエラーが発生しました。

プロセスで stdout/stderr をリダイレクトする最良の方法は、freopenを使用することです。これは、特にその主題に関するStackOverflowの質問です。

ただし、その呼び出しが渡されると、 が作成されます。それJNIEnv以降のすべてのエラー チェックは、 を呼び出すことで実行でき、実行する必要があります。これにより、JNI コードで問い合わせることができるオブジェクトJNIEnv::ExceptionOccurred()が返される場合があります。Throwable

于 2009-04-28T23:41:13.920 に答える