免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5465 | 回复: 11
打印 上一主题 下一主题

请问UNIX下的JNI中文乱码解决方法,另,JNI如何实现消息队列 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-04 19:12 |只看该作者 |倒序浏览
第一:
UNIX下的JNI中文乱码如何解决,JAVA 传过来的字段始终无法正确获取,如下,都是乱码:
        const jchar *str = (const jchar *)(*env)->GetStringUTFChars(env,jinstring, JNI_FALSE);
        printf("GetStringUTFChars:jinstring,%s:%s\n",str,jinstring);
       
        const jchar *str1 = (const jchar *)(*env)->GetStringChars(env,jinstring, JNI_FALSE);
        printf("GetStringChars:jinstring,%s:%s\n",str1,jinstring);

        const char *str2 = (const char *)(*env)->GetStringUTFChars(env,jinstring, NULL);
        printf("GetStringChars:jinstring,%s:%s\n",str1,jinstring);
第二:能否有办法解决JNI使用消息队列,JNI支持这么编程么?
如果有UNIX下JNI参考或者编程手册,请能给我一份

论坛徽章:
0
2 [报告]
发表于 2006-12-04 20:01 |只看该作者

JNI对消息队列支持还是可以的,跟正常一样,已经测试过了

第一点中文还是乱码...

论坛徽章:
0
3 [报告]
发表于 2006-12-04 22:13 |只看该作者
原帖由 dgguo 于 2006-12-4 19:12 发表
第一:
UNIX下的JNI中文乱码如何解决,JAVA 传过来的字段始终无法正确获取,如下,都是乱码:
        const jchar *str = (const jchar *)(*env)->GetStringUTFChars(env,jinstring, JNI_FALSE);
        printf("GetStr ...


如果Java程序中是中文,那么应该



  1.         int sLen=(*env)->GetStringLength(env,jnistr);
  2.         wchar_t * wstr=(wchar_t * )malloc( (sLen+1) * sizeof(wchar_t));
  3.          const jchar* ustr=(const jchar*)(*env)->GetStringChars(env,str,NULL);
  4.          int i=0;
  5.          setlocale(LC_CTYPE,"");
  6.          wcsncpy(wstr,(const wchar_t *)ustr,sLen);
  7.             wstr[sLen]=0;
  8.    
  9.          wprintf(L"string from java:%s\n",wstr);

  10.          (*env)->ReleaseStringChars(env,jnistr,ustr);

复制代码

(*env)->GetStringUTFChars(env,jnistr,NULL)返回的是ASCII码

[ 本帖最后由 yovn 于 2006-12-4 22:19 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-12-04 22:18 |只看该作者
原帖由 dgguo 于 2006-12-4 19:12 发表
第二:能否有办法解决JNI使用消息队列,JNI支持这么编程么?
如果有UNIX下JNI参考或者编程手册,请能给我一份 ...

当然可以阿,include <sys/msg.h>放心使用,JNI编程是不分Linux还是Windows的。仔细看JNI的Spec吧

论坛徽章:
0
5 [报告]
发表于 2006-12-05 09:30 |只看该作者

我用的是HP-UNIX,哪个头文件中包含wchar_t ?

谢谢3楼回答
但这个版本应该是VC可以实现的吧,UNIX该如何?

论坛徽章:
0
6 [报告]
发表于 2006-12-05 09:37 |只看该作者
原帖由 dgguo 于 2006-12-5 09:30 发表
谢谢3楼回答
但这个版本应该是VC可以实现的吧,UNIX该如何?

我确实在VC下测试,但是wchar.h和locale.h是标准C都有的吧,不只是VC有这样的环境。

论坛徽章:
0
7 [报告]
发表于 2006-12-05 09:44 |只看该作者
将JAVA的JVM升级到5.0,可以解决。

论坛徽章:
0
8 [报告]
发表于 2006-12-05 10:21 |只看该作者

还是有问题,再次麻烦看一下

传入的jinstring ="这是JAVA传入";
第三行的GetStringChars第二个参数3楼应该手误吧
执行代码如下:
        int sLen=(*env)->GetStringLength(env,jinstring);
        wchar_t * wstr=(wchar_t * )malloc( (sLen+1) * sizeof(wchar_t));
        const jchar* ustr=(const jchar*)(*env)->GetStringChars(env,jinstring,NULL);
        int i=0;
        setlocale(LC_CTYPE,"");
        wcsncpy(wstr,(const wchar_t *)ustr,sLen);
        wstr[sLen]=0;
        wprintf(L"sLen:%d,jinstring:%s,string from java:%s\n",sLen,jinstring,wstr);
        (*env)->ReleaseStringChars(env,jinstring,ustr);

输出结果:sLen:12,jinstring:tA?tA鸿tA襀,string from java:
为空了,什么都没有

论坛徽章:
0
9 [报告]
发表于 2006-12-05 16:34 |只看该作者

顶一个

浮起来,仍然没头绪
参考了网上很多方法,普遍写的比较简单
http://www.cublog.cn/u/12951/showart.php?id=68851获得了2个方法处理乱码
jstring ->char是
char *JNU_GetStringNativeChars(JNIEnv *env, jstring jstr)
正常OK
char->jstring是jstring JNU_NewStringNative(JNIEnv *env, const char *str)
失败在jmethodID jmethod_str = (*env)->GetMethodID(env,jcls_str, "", "([B)V");
提示Exception in thread "main" java.lang.NoSuchMethodError:

问题2个
1:如何JNI参数的传出,我需要传出一个消息串,我想应该是jstring 类型,现在我使用
2:char->Jstring转换存在上面说的问题,我该如何使用
char *stemp ="这是JNI传出的消息";
joutstring = (jstring)stemp;
在JAVA里面得到的是空值
System.out.println(joutstring )为空,该如何解决?
2个问题都是50分,谢谢,请大侠们帮助解决
请注意:环境JDK142,HP-UNIX,可能只要LINUX或者其它UNIX环境方法都能通用,但是VC下的方法是不行的

VC实现的一些方法包括W_CHAR我都试过了,仍然乱码
使用字节GetByteArrayElements方法也存在一些小问题

论坛徽章:
0
10 [报告]
发表于 2006-12-07 16:11 |只看该作者

依然没有解决 char ->jstring的汉字乱码处理

另,好像jni传入的jstring是传值传入,还需要大侠解释下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP