码迷,mamicode.com
首页 > 编程语言 > 详细

java调用c++ dll出现中文乱码

时间:2014-11-11 22:49:47      阅读:502      评论:0      收藏:0      [点我收藏+]

标签:blog   http   io   ar   os   使用   java   sp   for   

最近的开发用到了使用java调用本机动态连接库的功能,将文件路径通过java调用C++代码对文件进行操作。在调用中如果路径中包含有中文字符就会出现问题,程序运行就会中止。下面用一个小例子,来说明记录下解决的方法。

java中传入一个字符串,调用c++代码将字符串输出

public class CommonUtil
{
	static
	{
		System.loadLibrary("nativeTest");
	}
	public native static void Print(String str);
	public static void main(String args[])
	{
		CommonUtil.Print("中文乱码");
	}
}

执行javac CommonUtil.java和javah CommonUtil两条命令。会生成一个CommonUtil.h的c++头文件。CommonUtil.h的源码如下

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class CommonUtil */

#ifndef _Included_CommonUtil
#define _Included_CommonUtil
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     CommonUtil
 * Method:    Print
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_CommonUtil_Print
  (JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif
#endif

使用vs2005新建一个c++ dll的工程,将CommonUtil.h加入到项目中,再新建一个.cpp文件,用于实现Java_CommonUtil_Print这个函数,实现代码如下:

#include "CommonUtil.h"
#include <iostream>
using namespace std;

JNIEXPORT void JNICALL Java_CommonUtil_Print
			(JNIEnv *env, jclass obj, jstring jStr)
{
	const char *localStr = env->GetStringUTFChars(jStr,NULL);
	cout<<localStr<<endl;
}
在编译中需要加入java自带的c++头文件,否则比如像JNIEnv这样的类就会找不到,我用的是jdk1.6,所以了"C:\Program Files\Java\jdk1.6.0_10\include;C:\Program Files\Java\jdk1.6.0_10\include\win32"到项目属性中。

bubuko.com,布布扣

编译后生成一个dll,将dll拷到刚才编译的.class所在的文件夹中(做为一个简单的测试,没有使用包,如果使用包情况会略有不同)。

执行命令java CommonUtil输出如下

bubuko.com,布布扣

现在还完全搞清楚出现乱码的情况,不过网上有将java的utf编码转换成gb2312的代码。下面是转换的代码,代码来源:http://blog.csdn.net/yiyaaixuexi/article/details/6173592

char* jstringToWindows( JNIEnv *env, jstring jstr )
{ //UTF8/16转换成gb2312
  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 <= 0 )
    return NULL;
  (env)->ReleaseStringChars(jstr, jcstr );
  rtn[size] = 0;
  return rtn;
}
将Java_CommonUtil_Print改成如下:

JNIEXPORT void JNICALL Java_CommonUtil_Print
			(JNIEnv *env, jclass obj, jstring jStr)
{
	char *localStr = jstringToWindows(env, jStr);
	cout<<localStr<<endl;
	free(localStr);
}
重新编译,生成后的dll再拷到.class所在的文件夹中。

执行java CommonUtil

bubuko.com,布布扣
运行正常


java调用c++ dll出现中文乱码

标签:blog   http   io   ar   os   使用   java   sp   for   

原文地址:http://blog.csdn.net/mxway/article/details/41018893

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!