最近的开发用到了使用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的工程,将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"到项目属性中。

编译后生成一个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<

free(localStr);

}

重新编译,生成后的dll再拷到.class所在的文件夹中。

执行java CommonUtil

运行正常

java dll 乱码_java调用c++ dll出现中文乱码 | 学步园相关推荐

  1. java 读写文件乱码_Java 解决读写本地文件中文乱码的问题

    Java 解决读写本地文件中文乱码的问题 前言: 在用Java程序进行读写含中文的txt文件时,经常会出现读出或写入的内容会出现乱码.原因其实很简单,就是系统的编码和程序的编码采用了不同的编码格式.通 ...

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

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

  3. java工程编辑器中文乱码_Java Web开发项目中中文乱码解决方法汇总

    Java Web项目中,解决中文乱码方法总结如下 第一种情况:调用jsp页面中文显示乱码问题描述:通过浏览器调用jsp页面,在浏览器中显示的中文内容出现乱码. 解决方法:首先确认本jsp在编辑器中保存 ...

  4. java输出的汉字变成乱码_Java Web项目中解决中文乱码方法总结

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

  5. java通字乱码_Java解决通信过程的中文乱码的问题

    Java解决通信过程的中文乱码的问题 前言: Java的编程中,经常会碰到汉字的处里及显示的问题,比如一大堆乱码或问号. 这是因为JAVA中默认的编码方式是UNICODE,而中国人通常使用的文件和DB ...

  6. java 文件读取中文乱码_java文件读取时发生中文乱码怎么解决

    java文件读取时发生中文乱码怎么解决 发布时间:2020-06-23 09:33:47 来源:亿速云 阅读:59 作者:Leah java文件读取时发生中文乱码怎么解决?这篇文章运用了实例代码展示, ...

  7. java更改mysql数据乱码_java向mysql写入数据中文乱码解决方法

    造成乱码的原因是字符集不一致,通常只需要数据库建表时候指定的字符集与java设置数据库连接设置url指定的字符集一致. 1.创建数据库的时候:CREATE DATABASE `Db` CHARACTE ...

  8. java ip 国家_java通过ip获取用户所在国家 | 学步园

    什么是GeoIP ? 所谓GeoIP,就是通过来访者的IP, 定位他的经纬度,国家/地区,省市,甚至街道等位置信息的一个数据库.GeoIP有两个版本,一个免费版,一个收费版本.收费版本的准确率和数据更 ...

  9. java biginteger使用_java中的BigInteger的基本用法 | 学步园

    注 : 为了更好的理解BigInteger类,特提供了一篇关于BigInteger的题目及本人的解答,感兴趣的朋友可以到我的博客看一下 import java.math.BigInteger; pub ...

最新文章

  1. 联邦学习fate笔记小结
  2. SQL Server 2008备份大全实战(七)
  3. ASP中的工具类函数收集
  4. 使用示波器测量扬声器的阻抗实验数据
  5. 在SharePoint Foundation 2010中显示来自其他站点的列表
  6. Struts2异常| 页面写入s:debug/标签报错, 去掉此标签后正常显示
  7. OpenGL程序演示
  8. Android---手动创建线程与GUI线程同步(一)
  9. 架构之:REST和HATEOAS
  10. ext3文件系统反删除利器ext3grep应用实战
  11. mysql表单查询_MySQL表单集合查询
  12. NSURLRequest详解IOS最基础的api
  13. Android studio Gradle icon error, Manifest Merger
  14. 清空visual studio 开发缓存
  15. 骗子是怎样将1G硬盘变成120G的
  16. WIN10升级的做法有待友好设计
  17. paip.hibernate save 失败的解决
  18. iOS 消息发送与转发详解
  19. 《Python编程-从入门到实践》
  20. 大型网站架构技术演进(史上最全)

热门文章

  1. C/C++深入剖析指针机制与内存动态管理
  2. qq互联android sdk,qq互联.Android
  3. bing搜索php,PHP 使用bing搜索网站的api封装类用法
  4. C++中字符型和整型的关系
  5. 基于CC1310的915MHz硬件设计
  6. linux系统运行powerbi,使用 Power BI 服务 - Power BI | Microsoft Docs
  7. 红米ac2100breed看模块_骁龙865加持,红米K30S至尊纪念版11日再开售
  8. MATLAB 命令 BOXPLOT
  9. 基于java家教管理系统_基于jsp的家教信息管理-JavaEE实现家教信息管理 - java项目源码...
  10. 企业为什么要开通银企直联_企业为什么要做网站推广