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"到项目属性中。

ddc77265d4e16516f3b345ca743ddde8.png

编译后生成一个dll,将dll拷到刚才编译的.class所在的文件夹中(做为一个简单的测试,没有使用包,如果使用包情况会略有不同)。

执行命令java CommonUtil输出如下

f4c580889d668ab8fc39ad1718d19a54.png

现在还完全搞清楚出现乱码的情况,不过网上有将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

a960208b588d7b05ca6799156e57e219.png

运行正常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350006.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一问:Android 滑动冲突,你们都是怎样处理的

坚持原创日更&#xff0c;短平快的 Android 进阶系列&#xff0c;敬请直接在微信公众号搜索&#xff1a;nanchen&#xff0c;直接关注并设为星标&#xff0c;精彩不容错过。 在 Android 开发中&#xff0c;滑动冲突总是我们一个无法避免的话题。而对于解决方案却是众说纷纭。比…

java多线程 cpu分配_java多线程总结(转载)

Java 多线程编程总结-------------------------------------------------------------------------------------------------下面的内容是很早之前写的&#xff0c;内容不够充实&#xff0c;而且是基于Java1.4的内容&#xff0c;Java5之后&#xff0c;线程并发部分扩展了相当多…

java设计模式迭代器模式_迭代器模式和Java

java设计模式迭代器模式大家好&#xff0c;在本文中&#xff0c;我们将检查Iterator Pattern 。 我知道你们中许多人已经使用过一种设计模式&#xff0c;但是也许您没有意识到它是模式&#xff0c;或者不知道它的巨大价值。 根据《 Head First Design 》一书&#xff1a; 迭代…

笔记_SQLite入门

1、SQLite是什么&#xff1f; QLite没有单独的服务器进程。 它直接读取和写入普通磁盘文件。 具有多个表&#xff0c;索引&#xff0c;触发器和视图的完整SQL数据库包含在单个磁盘文件中。2、SQLite语法 区分大小写&#xff1a; SQLite不区分大小写。但是&#xff0c;有一些区分…

java线程提交_从Java线程到线程池

线程模型线程模型分为两类&#xff0c;用户级线程(ULT)和内核级线程(KLT)用户级线程(ULT)&#xff1a;user level threads&#xff0c;系统内核对ULT无感知&#xff0c;线程的创建和调度都由用户级APP进程管理&#xff1b;即APP自行管理的线程&#xff0c;就是用户级线程内核级…

使用Spring Boot自动发布和监视API

如果您正在沿着微服务风格的架构前进&#xff0c;那么您将需要接受的一个租户就是自动化。 这种架构风格介绍了许多活动部件。 如果成功&#xff0c;您的环境将具有大量服务API&#xff0c;企业可以将其用于应用程序开发和集成。 这意味着必须有一种方法可以发现可用的API文档…

mysql导入导出

导出1.将数据库mydb导出到e:\mysql\mydb.sql文件中&#xff1a;打开开始->运行->输入cmd 进入命令行模式c:\>mysqldump -h localhost -u root -p mydb >e:\mysql\mydb.sql然后输入密码&#xff0c;等待一会导出就成功了&#xff0c;可以到目标文件中检查是否成功。…

mysql 半同步关闭_MySQL的半同步模式配置

1、什么是半同步&#xff1f;在有一台主服务器、多台从服务器的情况下&#xff0c;主服务器只会等待一台从服务器同步数据。2、为什么要使用半同步&#xff1f;在使用同步模式时&#xff0c;数据的写速度太慢。在使用异步模式时&#xff0c;可能会造成从服务器上的现在存储的数…

GIS集成技术之二:数据集成

一。数据驱动。疑惑&#xff1a;ado.net作为一种通用的数据技术&#xff0c;适用与各种格式的文件各种格式的数据库&#xff0c;为一种通用的编程模型。GIS也提出数据集成&#xff1a;毫无疑问&#xff0c;不陷于某击中数据库。因此&#xff0c;我觉得GIS的中心是数据驱动&…

mysql中的replication_mysql中replication的相关问题总结

首先&#xff0c;要使用mysql中的replication&#xff0c;则需要配置master的my.cnf。例如&#xff1a;复制代码 代码示例:server-id 1log_bin mysql-bin#log_bin /var/log/mysql/mysql-bin.logexpire_logs_days 10max_binlog_size 100M#binlog_do_db include_database_na…

rest spring_带有Spring的REST的ETag

rest spring1.概述 本文将重点介绍ETag – Spring支持&#xff0c;RESTful API的集成测试以及带有curl的使用场景。 这是关于使用Spring 3.1和Spring Security 3.1和基于Java的配置来建立安全的RESTful Web服务的系列文章的第9篇。 REST with Spring系列&#xff1a; 第1部分 …

MySQL最早版本源码_MySQL旧版本升级为新版本

一&#xff1a;从版本3.23升级到4.104.10新特性&#xff1a;支持事务处理和存储过程升级过程的注意事项&#xff1a;1:升级采用直接复制安装文件的方法&#xff0c;简单实用&#xff0c;但要注意相关的配置更改&#xff1b; 2:直接复制备份的数据库不能通过复制的方法恢复&…

关于国产科学软件的思考(转)

转自 http://blog.pfan.cn/eMath/24264.html 作者 爱数学 http://blog.pfan.cn/eMath 原文如下&#xff1a; 这一段一直在问自己这个问题&#xff1a;“在我们常用的科学计算软件当中&#xff0c;有多少国产的&#xff1f;”&#xff0c;在记忆里面搜索了很久&#xff0c;似乎…

每个私有静态方法都是新类的候选人

您是否有私有的静态方法来帮助您将算法分解为更小的部分&#xff1f; 我做。 每次编写新方法时&#xff0c;我都会意识到它可以是一个新类。 当然&#xff0c;我不会从所有课程中选修课程&#xff0c;但这是目标。 私有静态方法不可重用&#xff0c;而类则可重用&#xff0c;这…

448. Find All Numbers Disappeared in an Array

一、题目 1、审题  2、分析 一个整形数组&#xff01;元素值为 1~size; 出现的元素次数为 1~2 次。 求出所有 1~size 中没有出现的整数&#xff01; 二、解答 1、思路 由于元素值都为 1~size之间。所以可以将数组下标 index 进行联系。 ① 遍历数组&#xff0c;将出现的元素值…

枚举:如何正确使用name()和toString()方法

两种方法之间的区别&#xff1f; Java枚举有两种方法来检索枚举常量的值&#xff1a; name&#xff08;&#xff09;和.toString&#xff08;&#xff09; 。 toString&#xff08;&#xff09;方法调用name&#xff08;&#xff09;方法&#xff0c;该方法返回枚举常量的字符串…

gradle maven_Gradle – Maven的观点

gradle maven正如我博客的读者所知道的&#xff0c; 我有点像Maven迷 。 我从2007年8月左右开始使用Maven&#xff0c;从没有回过头。 但是&#xff0c;与其他所有情况一样&#xff0c;“变化是唯一的常数”。 现在这个领域还有其他参与者&#xff0c;Gradle似乎是最有前途的。…

JDK 9中已弃用Java的Observer和Observable

在博客文章《 应用JDK 9 Deprecated增强功能》中 &#xff0c;我讨论了JDK 9中 Deprecated批注中对forRemoval&#xff08;&#xff09;和since&#xff08;&#xff09;可选元素&#xff08;方法&#xff09;的添加 。 我在那篇文章中说&#xff1a;“在Java SE API上应用新的…

理解依赖注入(IOC)和学习Unity

IOC:英文全称&#xff1a;Inversion of Control&#xff0c;中文名称&#xff1a;控制反转&#xff0c;它还有个名字叫依赖注入&#xff08;Dependency Injection&#xff09;。 作用&#xff1a;将各层的对象以松耦合的方式组织在一起&#xff0c;解耦&#xff0c;各层对象的调…

java中怎样验证重复文件_java – 如何在下载之前检查URL中的重复文件

如果您有基本URL并存储具有相同文件名的文件.由于文件修改时间和If-Modified-Since HTTP Header,您可以询问服务器是否值得再次下载映像.File f new File();// the file to downloadHttpURLConnection con (HttpURLConnection) new URL("http://www.test.com/"f.ge…