最近的开发用到了使用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工程编辑器中文乱码_Java Web开发项目中中文乱码解决方法汇总

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

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

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

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

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

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

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

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

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

  7. java 采用串口通信实现LED屏发送数据中文乱码问题

    java 采用串口通信实现LED屏发送数据中文乱码问题 1.定义:Pointer p = new Pointer(MemoryBlockFactory.createMemoryBlock(1024)) ...

  8. python读取压缩文件时乱码,zipfile解压缩包,出现中文乱码问题问题

    python读取压缩文件时乱码,zipfile解压缩包,出现中文乱码问题问题 问题描述--python 使用zipfile模块 读取并且解压缩包,出现中文乱码问题 问题原因 python 使用这个模块 ...

  9. mysql 存json中文乱码怎么设置_解决 MySQL 中文乱码

    想要解决MySQL中文乱码首先必须了解下MySQL所支持的字符集,至于中文乱码出现的原因可以总结为:向数据库中插入的数据与数据库中的表所使用的字符集编码不同 一 . MySQL 中文字符集 常见支持中 ...

最新文章

  1. 使用 Smartmontools 检测硬盘坏道
  2. c语言一维数组逆序输出_剑指信奥 | C 语言之兵人来袭!
  3. vim command(vim命令)
  4. CodeSmith连接mysql
  5. 《最后期限》阅读笔记2
  6. 从零开始搭建spring-cloud(3) ----feign
  7. 双十一要来了,设计没思路看看案例
  8. OpenShift 4 - 关闭更新MachineConfig后集群节点自动重启功能
  9. Face alignment at 3000 FPS via Regressing Local Binary Features
  10. 【多线程】Semaphore:实现快速限流器
  11. 使用 Request.Form 集合之后,不能调用 BinaryRead
  12. 使用Visual Studio SDK制作GLSL词法着色插件
  13. linux校园网自动登录命令,东北大学校园网登录登出shell脚本
  14. 基于mint-ui的移动应用开发案例一(简介)
  15. matlab 2010 win10,win10系统运行matlab2010找不到指定的程序的教程介绍
  16. 使用excelJs.js,导出excel,可以设置序列以及下拉框的联动
  17. 开发一个APP有多难?APP开发流程、开发成本揭秘
  18. 微型计算机结构框图,微型计算机系统结构图.doc
  19. TreeSet,海康威视java校招面试题
  20. Discuz论坛如何使用SendCloud?

热门文章

  1. zigbee bind, ZDO_RegisterForZDOMsg, zcl_registerForMsg
  2. ---WebCam网络摄像头7 cmos--yuv rgb , Format............:V4L2_PIX_FMT_YUYV
  3. ZOJ 1161 Gone Fishing
  4. 线上oom 自动kill 程序
  5. VS2013找不到winres.h的解决办法
  6. UIView的属性使用
  7. 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
  8. 30多年程序员生涯经验总结(成功源自于失败中的学习;失败则是因为容忍错误的横行)...
  9. Android软键盘的显示与隐藏
  10. 使用Solr 增加索引以及检索