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 调用 dll 乱码_java调用c++ dll出现中文乱码
最近的开发用到了使用java调用本机动态连接库的功能,将文件路径通过java调用C++代码对文件进行操作.在调用中如果路径中包含有中文字符就会出现问题,程序运行就会中止.下面用一个小例子,来说明记录下 ...
- 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 ip 国家_java通过ip获取用户所在国家 | 学步园
什么是GeoIP ? 所谓GeoIP,就是通过来访者的IP, 定位他的经纬度,国家/地区,省市,甚至街道等位置信息的一个数据库.GeoIP有两个版本,一个免费版,一个收费版本.收费版本的准确率和数据更 ...
- java biginteger使用_java中的BigInteger的基本用法 | 学步园
注 : 为了更好的理解BigInteger类,特提供了一篇关于BigInteger的题目及本人的解答,感兴趣的朋友可以到我的博客看一下 import java.math.BigInteger; pub ...
最新文章
- 联邦学习fate笔记小结
- SQL Server 2008备份大全实战(七)
- ASP中的工具类函数收集
- 使用示波器测量扬声器的阻抗实验数据
- 在SharePoint Foundation 2010中显示来自其他站点的列表
- Struts2异常| 页面写入s:debug/标签报错, 去掉此标签后正常显示
- OpenGL程序演示
- Android---手动创建线程与GUI线程同步(一)
- 架构之:REST和HATEOAS
- ext3文件系统反删除利器ext3grep应用实战
- mysql表单查询_MySQL表单集合查询
- NSURLRequest详解IOS最基础的api
- Android studio Gradle icon error, Manifest Merger
- 清空visual studio 开发缓存
- 骗子是怎样将1G硬盘变成120G的
- WIN10升级的做法有待友好设计
- paip.hibernate save 失败的解决
- iOS 消息发送与转发详解
- 《Python编程-从入门到实践》
- 大型网站架构技术演进(史上最全)
热门文章
- C/C++深入剖析指针机制与内存动态管理
- qq互联android sdk,qq互联.Android
- bing搜索php,PHP 使用bing搜索网站的api封装类用法
- C++中字符型和整型的关系
- 基于CC1310的915MHz硬件设计
- linux系统运行powerbi,使用 Power BI 服务 - Power BI | Microsoft Docs
- 红米ac2100breed看模块_骁龙865加持,红米K30S至尊纪念版11日再开售
- MATLAB 命令 BOXPLOT
- 基于java家教管理系统_基于jsp的家教信息管理-JavaEE实现家教信息管理 - java项目源码...
- 企业为什么要开通银企直联_企业为什么要做网站推广