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



执行正常

java调用c++ dll出现中文乱码的更多相关文章

  1. Java调用第三方dll文件的使用方法 System.load()或System.loadLibrary()

    Java调用第三方dll文件的使用方法 public class OtherAdapter { static { //System.loadLibrary("Connector") ...

  2. paip.java 调用c++ dll so总结

    paip.java 调用c++ dll so总结 ///////JNA (这个ms sun 的) 我目前正做着一个相关的项目,说白了JNA就是JNI的替代品,以前用JNI需要编译一层中间库,现在JNA ...

  3. 巧用C#做中间语言 实现Java调用.net DLL

    本文将详细为大家介绍一个java调用.net DLL的方法,以实现特殊的客户的特殊要求:“在Java项目中必须使用其提供的用.net写的DLL加密机制!” 环境与工具: ◆.net framework ...

  4. [JNI] Java 调用 C++ dll

    首先介绍一下JNI吧! JNI 是Java提供的一个用于调用本地接口的接口层,位于Java代码 和 本地代码之间的一层:主要功能是 数据类型的转换,还有就是通过这一层来调用本地代码! 下面就说说Jav ...

  5. java web 中有效解决中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别

    这里先写几个大家容易搞混的编码设置代码: 在jsp代码中的头部往往有这两行代码 pageEncoding是jsp文件本身的编码contentType的charset是指服务器发送给客户端时的内容编码J ...

  6. Java Web项目中解决中文乱码方法总结

    一.了解常识: 1.UTF-8国际编码,GBK中文编码.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立; 2.web tomcat:默认是ISO8859-1,不 ...

  7. java调用C++ DLL库方法

    最近一个项目要开发网页端人脸识别项目,人脸识别的算法已经写好,是C++版,但是网页端要求使用Java后台,这就涉及到Java调用DLL的问题.经过查找,实现了一个简单的例子. 1.第一步,先在Java ...

  8. java中可以出现的中文乱码的集中解决

    从学习javaweb开始就会经常遇到中文乱码,今天就做以下记录: 1. 要避免项目中遇到乱码,首先就是在搭建项目的设置工作空间的字符编码,若是多人开发,就更应该做到统一,在eclipse中选择widn ...

  9. Java Web 开发中的中文乱码与解决方式

    乱码产生的原因 不管是request乱码还是response乱码,其实都是由于客户端(浏览器)跟服务器端采用的编码格式不一致造成的.以request乱码为例:浏览器向服务器发送请求,因为浏览器与服务器 ...

随机推荐

  1. Spring Cloud (10) Hystrix-监控面板

    Hystrix DashBoard 断路器是根据一段时间窗内的请求状况来判断并操作断路器的打开和关闭状态的.Hystrix Dashboard是作为断路器状态的一个组件,提供了数据监控和友好的图形化界 ...

  2. 【年终糖果计划】跟风领一波糖果 candy.one 领取教程

    糖果领取网址(较为稳定):https://candy.one/i/1474564 用微信和QQ打开的朋友请复制到其他浏览器打开 糖果领取网址(较为稳定):https://candy.one/i/147 ...

  3. Android项目实战_手机安全卫士拦截骚扰

    ###1.骚扰拦截需求分析1.界面1.1 黑名单列表界面1.2 添加黑名单界面2.功能2.1 黑名单的添加.删除2.2 拦截电话2.3 拦截短信 ###2.黑名单数据库的创建1.分析需要的字段id 主 ...

  4. [Windows Server 2003] ASP.net安装方法

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:安装ASP.n ...

  5. 新人转型学习C#

    毕业3年,终于在4个多月前,下定决心辞职了.一直以来都想从事软件开发的工作,也觉得自己更加适合这方面的工作.自己如果这一次还是没能往这方面发展的话,感觉以后也不会有机会了. 于是,想着工作先不找了,买 ...

  6. 如何在eclipse中设置断点并调试程序

    eclipse导入源码后可以看见代码但并不能调试,(解决方法) 1.eclipse默认的运行环境不是jdk中的jre.将jre换成jdk: 2. 先去掉勾,apply,在打上勾,apply 参考:ht ...

  7. excel求1加到100的和

    强大的数组公式

  8. yum仓库配置ftpx协议

    [root@localhost ~]# iptables -F[root@localhost ~]# systemctl stop firewalld[root@localhost ~]# syste ...

  9. 【原创】使用JS封装的一个小型游戏引擎及源码分享

    1 /** * @description: 引擎的设计与实现 * @user: xiugang * @time: 2018/10/01 */ /* * V1.0: 引擎实现的基本模块思路 * 1.创建 ...

  10. How To : Modify ASM SYS password using asmcmd 11g R2 and upper

    修改RAC 11gR2及以上版本的ASM的SYS的密码方法 [grid]$ asmcmd ASMCMD> orapwusr --modify --password sys Enter passw ...