JNI:无法将jstring转换为LPCTSTR?

时间:2011-03-03 22:07:57

标签: java c++ java-native-interface

C ++方面如下所示:

JNIEXPORT jint JNICALL Java_Myclass_showMessage (JNIEnv* env, jobject obj, jstring title, jstring message, jint type)
{
    const char* _title = env->GetStringUTFChars(title, 0);
    const char* _message = env->GetStringUTFChars(message, 0);
    const int result = MessageBox(NULL, (LPCTSTR) _message, (LPCTSTR) _title, type);
    env->ReleaseStringUTFChars(title, _title);
    env->ReleaseStringUTFChars(message, _message);
    return result;
}

和java方面:

int result = showMessage("caption", "Hello!", 0);

然而,当我从java调用导出的函数时,这就是我得到的:

http://i54.tinypic.com/wu5hs0.png

知道可能导致这种情况的原因吗?

1 个答案:

答案 0 :(得分:2)

使用MessageBoxA - MessageBox根据您的项目Unicode / MBCS设置自动选择wide或mbcs版本。

如果你需要施放到LPCTSTR,这表示出现了问题。

或者,使用GetStringChars和MessageBoxW,在这种情况下,您可能需要根据jchar的定义进行强制转换。

编辑:示例代码

JNIEXPORT jint JNICALL Java_Myclass_showMessage (JNIEnv* env, jobject obj, jstring title, jstring message, jint type)
{
    const jchar* _title = env->GetStringChars(title, 0);
    const jchar* _message = env->GetStringChars(message, 0);
    const int result = MessageBox(NULL, (wchar_t *) _message, (wchar_t *) _title, type);
    env->ReleaseStringChars(title, _title);
    env->ReleaseStringChars(message, _message);
    return result;
}

在这种情况下,转换工作正常,因为wchar_t恰好是16位宽,与jchar相同。