Chinaunix首页 | 论坛 | 博客
  • 博客访问: 383971
  • 博文数量: 117
  • 博客积分: 2530
  • 博客等级: 少校
  • 技术积分: 1262
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-11 08:56
文章分类

全部博文(117)

文章存档

2015年(8)

2011年(2)

2010年(2)

2009年(16)

2008年(27)

2007年(42)

2006年(20)

我的朋友

分类: Java

2006-10-11 11:27:07

JavaC之间通过JNI传递中文字符串

因为java的打印类有点BUG,只好用JNI调win的打印程序,结果碰到unicode到char的字符转换。原以为可以直接利用getStringChars的wchar_t类型字符,结果控制台打不出字符。后来在网上找到一个字符转换的函数

c风格的:

char* jstringToWindows( JNIEnv  *env, jstring jstr )

{

  int length = (*env)->GetStringLength(env,jstr );

  const jchar* jcstr = (*env)->GetStringChars(env,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 <= 0 )

    return NULL;

  (*env)->ReleaseStringChars(env,jstr, jcstr );

  rtn[size] = 0;

  return rtn;

}

 

jstring WindowsTojstring( JNIEnv* env, char* str )

{

  jstring rtn = 0;

  int slen = strlen(str);

  unsigned short* buffer = 0;

  if( slen == 0 )

    rtn = (*env)->NewStringUTF(env,str );

  else

  {

    int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );

    buffer = malloc( length*2 + 1 );

    if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )

      rtn = (*env)->NewString( env, (jchar*)buffer, length );

  }

  if( buffer )

  free( buffer );

  return rtn;

}

还有一点很重要,就是编译的h文件中,如果java类是在包中,要注意h头文件的函数名是否有包的名字,没有就加上
阅读(1964) | 评论(0) | 转发(0) |
0

上一篇:当你老了

下一篇:发的论文终于有回复了

给主人留下些什么吧!~~