当前位置: 技术问答>java相关
还是jni的中文问题
来源: 互联网 发布时间:2015-11-10
本文导语: 我的操作系统是solaris8,标准c 我查了以前一些有关这方面的帖子,但还是无法解决 我只要java中显示c程序中返回的中文字符,但无法正确显示 传出: jstring jline = (*env)->NewStringUTF(env, char_line); 请高手在给讲讲,能...
我的操作系统是solaris8,标准c
我查了以前一些有关这方面的帖子,但还是无法解决
我只要java中显示c程序中返回的中文字符,但无法正确显示
传出:
jstring jline = (*env)->NewStringUTF(env, char_line);
请高手在给讲讲,能给两行例子程序就最好了。
谢谢!!
我查了以前一些有关这方面的帖子,但还是无法解决
我只要java中显示c程序中返回的中文字符,但无法正确显示
传出:
jstring jline = (*env)->NewStringUTF(env, char_line);
请高手在给讲讲,能给两行例子程序就最好了。
谢谢!!
|
给你两个C函数(工作在C++下):
.h文件:
#include
#include
jstring WindowsTojstring( JNIEnv* , char*);
char* jstringToWindows( JNIEnv* env, jstring jstr );
.cpp程序:
jstring WindowsTojstring(JNIEnv* env, char* str) {
jstring rtn = 0;
int slen = strlen(str);
wchar_t* buffer = 0;
if(slen == 0)
rtn = env->NewStringUTF(str); //UTF ok since empty string
else {
int length = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str, slen, NULL, 0);
buffer = (wchar_t*)malloc(length * 2 + 1);
if(MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )
rtn = env->NewString((jchar*)buffer, length);
}
if(buffer)
free(buffer);
return rtn;
}
char* jstringToWindows(JNIEnv* env, jstring jstr)
{
int length = env->GetStringLength(jstr);
const jchar* jcstr = env->GetStringChars(jstr, 0);
char* rtn = (char*)malloc(length * 2 + 1);
int size = 0;
size = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)jcstr, length, rtn, (length*2+1), NULL, NULL);
if(size ReleaseStringChars(jstr, jcstr);
rtn[size] = 0;
return rtn;
}
.h文件:
#include
#include
jstring WindowsTojstring( JNIEnv* , char*);
char* jstringToWindows( JNIEnv* env, jstring jstr );
.cpp程序:
jstring WindowsTojstring(JNIEnv* env, char* str) {
jstring rtn = 0;
int slen = strlen(str);
wchar_t* buffer = 0;
if(slen == 0)
rtn = env->NewStringUTF(str); //UTF ok since empty string
else {
int length = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str, slen, NULL, 0);
buffer = (wchar_t*)malloc(length * 2 + 1);
if(MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )
rtn = env->NewString((jchar*)buffer, length);
}
if(buffer)
free(buffer);
return rtn;
}
char* jstringToWindows(JNIEnv* env, jstring jstr)
{
int length = env->GetStringLength(jstr);
const jchar* jcstr = env->GetStringChars(jstr, 0);
char* rtn = (char*)malloc(length * 2 + 1);
int size = 0;
size = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)jcstr, length, rtn, (length*2+1), NULL, NULL);
if(size ReleaseStringChars(jstr, jcstr);
rtn[size] = 0;
return rtn;
}