java调用c++ dll出现中文乱码
来源:互联网 发布:手机上的淘宝卖家中心 编辑:程序博客网 时间:2024/05/17 01:15
最近的开发用到了使用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 __cplusplusextern "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"到项目属性中。
编译后生成一个dll,将dll拷到刚才编译的.class所在的文件夹中(做为一个简单的测试,没有使用包,如果使用包情况会略有不同)。
执行命令java CommonUtil输出如下
现在还完全搞清楚出现乱码的情况,不过网上有将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
运行正常
3 0
- java调用c++ dll出现中文乱码
- java中文乱码 防止出现中文乱码
- Java工作笔记:在jetty插件下调用C接口透传数据库正常但在Tomcat下中文出现乱码现象
- Java调用C#dll全过程
- c#调用vc的dll (参数有LPSTR) 出现乱码!
- QT调用vc dll中文乱码的问题
- Java读取中文文件出现乱码解决方法
- Myeclipse出现 java文件中文乱码问题
- Java socket接收出现中文乱码
- Java socket接收出现中文乱码
- Myeclipse出现 java文件中文乱码问题
- Java插入MySQL中文出现乱码
- java-上传文件-出现中文乱码。
- Java MySQL 中文出现乱码的问题
- Java:jdbc数据库连接出现中文乱码问题
- java 【导出excel 】文件名出现中文乱码
- JAVA 通过 JNA 调用 C程序 dll 函数传入中文参数问题
- ajax调用java,中文乱码解决办法
- 关联规则挖掘算法综述
- PHP实现牛津英汉词典
- Android理解:显式和隐式Intent
- Struts2学习笔记(二)使用jQuery—Ajax技术的简单Demo
- 绿果网客户端
- java调用c++ dll出现中文乱码
- adf学习:进度条的使用(progress bar demo)
- 区域赛选拔题G--Think I'll Buy Me a Football Team
- 蓝桥杯巧排扑克
- 【二分图最大匹配】【HDU2063】过山车
- Advanced clustering methods (Cure, Chameleon, Rock, Jarvis-Petrich)
- hdu 1277 全文检索(AC自动机)
- 苹果系统下的文件对比--Macos文件对比工具
- 外星人的供给站