java 调用 dll 乱码_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的工程,将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出现中文乱码相关推荐
- java 读写文件乱码_Java 解决读写本地文件中文乱码的问题
Java 解决读写本地文件中文乱码的问题 前言: 在用Java程序进行读写含中文的txt文件时,经常会出现读出或写入的内容会出现乱码.原因其实很简单,就是系统的编码和程序的编码采用了不同的编码格式.通 ...
- java工程编辑器中文乱码_Java Web开发项目中中文乱码解决方法汇总
Java Web项目中,解决中文乱码方法总结如下 第一种情况:调用jsp页面中文显示乱码问题描述:通过浏览器调用jsp页面,在浏览器中显示的中文内容出现乱码. 解决方法:首先确认本jsp在编辑器中保存 ...
- java输出的汉字变成乱码_Java Web项目中解决中文乱码方法总结
一.了解常识: 1.UTF-8国际编码,GBK中文编码.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立; 2.web tomcat:默认是ISO8859-1,不 ...
- java通字乱码_Java解决通信过程的中文乱码的问题
Java解决通信过程的中文乱码的问题 前言: Java的编程中,经常会碰到汉字的处里及显示的问题,比如一大堆乱码或问号. 这是因为JAVA中默认的编码方式是UNICODE,而中国人通常使用的文件和DB ...
- java 文件读取中文乱码_java文件读取时发生中文乱码怎么解决
java文件读取时发生中文乱码怎么解决 发布时间:2020-06-23 09:33:47 来源:亿速云 阅读:59 作者:Leah java文件读取时发生中文乱码怎么解决?这篇文章运用了实例代码展示, ...
- java更改mysql数据乱码_java向mysql写入数据中文乱码解决方法
造成乱码的原因是字符集不一致,通常只需要数据库建表时候指定的字符集与java设置数据库连接设置url指定的字符集一致. 1.创建数据库的时候:CREATE DATABASE `Db` CHARACTE ...
- java 采用串口通信实现LED屏发送数据中文乱码问题
java 采用串口通信实现LED屏发送数据中文乱码问题 1.定义:Pointer p = new Pointer(MemoryBlockFactory.createMemoryBlock(1024)) ...
- python读取压缩文件时乱码,zipfile解压缩包,出现中文乱码问题问题
python读取压缩文件时乱码,zipfile解压缩包,出现中文乱码问题问题 问题描述--python 使用zipfile模块 读取并且解压缩包,出现中文乱码问题 问题原因 python 使用这个模块 ...
- mysql 存json中文乱码怎么设置_解决 MySQL 中文乱码
想要解决MySQL中文乱码首先必须了解下MySQL所支持的字符集,至于中文乱码出现的原因可以总结为:向数据库中插入的数据与数据库中的表所使用的字符集编码不同 一 . MySQL 中文字符集 常见支持中 ...
最新文章
- 使用 Smartmontools 检测硬盘坏道
- c语言一维数组逆序输出_剑指信奥 | C 语言之兵人来袭!
- vim command(vim命令)
- CodeSmith连接mysql
- 《最后期限》阅读笔记2
- 从零开始搭建spring-cloud(3) ----feign
- 双十一要来了,设计没思路看看案例
- OpenShift 4 - 关闭更新MachineConfig后集群节点自动重启功能
- Face alignment at 3000 FPS via Regressing Local Binary Features
- 【多线程】Semaphore:实现快速限流器
- 使用 Request.Form 集合之后,不能调用 BinaryRead
- 使用Visual Studio SDK制作GLSL词法着色插件
- linux校园网自动登录命令,东北大学校园网登录登出shell脚本
- 基于mint-ui的移动应用开发案例一(简介)
- matlab 2010 win10,win10系统运行matlab2010找不到指定的程序的教程介绍
- 使用excelJs.js,导出excel,可以设置序列以及下拉框的联动
- 开发一个APP有多难?APP开发流程、开发成本揭秘
- 微型计算机结构框图,微型计算机系统结构图.doc
- TreeSet,海康威视java校招面试题
- Discuz论坛如何使用SendCloud?
热门文章
- zigbee bind, ZDO_RegisterForZDOMsg, zcl_registerForMsg
- ---WebCam网络摄像头7 cmos--yuv rgb , Format............:V4L2_PIX_FMT_YUYV
- ZOJ 1161 Gone Fishing
- 线上oom 自动kill 程序
- VS2013找不到winres.h的解决办法
- UIView的属性使用
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
- 30多年程序员生涯经验总结(成功源自于失败中的学习;失败则是因为容忍错误的横行)...
- Android软键盘的显示与隐藏
- 使用Solr 增加索引以及检索