4

String を返す Java インスタンス メソッドがあり、C++ で JNI を介してこのメ​​ソッドを呼び出しています。私は次のコードを書きました:

const char *DiagLayerContainer_getDESC(JNIEnv *env, jobject diagLayer) {
    jclass diagLayerClass = env->FindClass(PARSER_CLASS);
    jmethodID getDESCDiagLayerMethodID = env->GetMethodID(diagLayerClass, "getDESCDiagLayer", "(Ljava/lang/Object;)Ljava/lang/String;");
    jstring returnString = (jstring) env->CallObjectMethod(diagLayer, getDESCDiagLayerMethodID);
    return env->GetStringUTFChars(returnString, JNI_FALSE);
}

文字列を取得して const char * に変換するにはどうすればよいですか?

プログラムが最後の行で 0x00000000 へのアクセス違反でクラッシュします。returnString は NULL ではありません。

4

1 に答える 1

7

によるとGetStringUTFChars、最後のパラメータは へのポインタjbooleanです。

変化する

return env->GetStringUTFChars(returnString, JNI_FALSE);

return env->GetStringUTFChars(returnString, NULL);

またはさらに良いことに、std::string

std::string DiagLayerContainer_getDESC(...) {
    ...
    const char *js = env->GetStringUTFChars(returnString, NULL);
    std::string cs(js);
    env->ReleaseStringUTFChars(returnString, js);
    return cs;
}

同様の単純な例を作成しましたが、コードはそのままで、これまでのところ問題ないようです。

ただし、考えられるエラーの原因は 2 つあります。

最初のものはメソッドの署名です。"()Ljava/lang/String;"の代わりに試してください"(Ljava/lang/Object;)Ljava/lang/String;"

2 つ目は、Java ソース自体にあります。Java メソッドが NULL 文字列を返す場合、CallObjectMethod()は NULLjstringを返し、GetStringUTFChars()失敗します。

を追加

if (returnString == NULL)
    return NULL;

CallObjectMethod()

そのため、Java ソースを調べて、メソッドgetDESCDiagLayer()が null 文字列を返す可能性があるかどうかを確認してください。

于 2013-03-07T10:24:29.360 に答える