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

近期的开发用到了使用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

/* 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的project。将CommonUtil.h增加到项目中。再新建一个.cpp文件,用于实现Java_CommonUtil_Print这个函数。实现代码例如以下:

#include "CommonUtil.h"

#include

using namespace std;

JNIEXPORT void JNICALL Java_CommonUtil_Print

(JNIEnv *env, jclass obj, jstring jStr)

{

const char *localStr = env->GetStringUTFChars(jStr,NULL);

cout<

}在编译中须要增加java自带的c++头文件,否则比方像JNIEnv这种类就会找不到,我用的是jdk1.6,所以了"C:\Program Files\Java\jdk1.6.0_10\include;C:\Program Files\Java\jdk1.6.0_10\include\win32"到项目属性中。

ddc77265d4e16516f3b345ca743ddde8.png

编译后生成一个dll。将dll拷到刚才编译的.class所在的目录中(做为一个简单的測试,没有使用包。假设使用包情况会略有不同)。

运行命令java CommonUtil输出例如以下

f4c580889d668ab8fc39ad1718d19a54.png

如今还全然搞清楚出现乱码的情况,只是网上有将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<

free(localStr);

}又一次编译,生成后的dll再拷到.class所在的目录中。

运行java CommonUtil

a960208b588d7b05ca6799156e57e219.png

执行正常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值