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
知道可能导致这种情况的原因吗?
答案 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相同。