彻底解决JNA String(Java)转char*(c++)乱码问题

前言

关于JNA入门教程,环境搭建非常简单,网上资料也非常多,这里就不在赘述了。

简单讲JNA就是针对java调用C++动态库开发的jar包程序,使java调用c++动态库变得非常简单

JNA主要负责:

  • 接口调用 - 将C++接口转化成java方法
  • 参数转化 - 将C++类型参数转化成java数据类型

解决JNA乱码

在JNA开发过程中,中文乱码应该占据了全部问题的70%,前阵子终于下定决心,彻底根治。网上关于此问题解释也挺多,不过很多解决方法其实是有问题的。

乱码出现原因:

JNA在对c++的char*和JAVA的String进行互相转换时候,针对C++字符数组编码设定错误导致

网上常见解决办法:

  1. 各种修改eclipse、Tomcat字符编码(治标不治本)
  2. 各种折腾String,转来转去(完全不需要,因为String根本没变)

本人解决思路:

JAVA的String是由unicode的char数组构造,既然是unicode构造,所以在将String转成char*的时候肯定不需要对String做任何改变,因为不管怎么变,字符串的unicode值也不可能有差异(网上很多都是说改变String,其实是不正确的)

解决方法其实很简单,只需要更改下JNA中字符串编码即可,该编码指定了String转换成char*时使用的字符编码,完全不需要修改eclipse、Tomcat字符编码

//c++ char* GBK编码时
System.setProperty("jna.encoding","GBK");

//c++ char* UTF8编码时
System.setProperty("jna.encoding","UTF-8");

辟谣:网上有很多人说JNA字符编码默认就是UTF8,其实是错误的,大家可以获取测试下,默认就是默认字符编码。默认编码是啥呢?程序运行环境编码,eclipse调试时就是eclipse的字符编码,tomcat直接运行时候就是系统默认字符编码。(Windows就是GBK,linux是UTF8)

另外,其实还有个更简单的办法,JNA提供了一个宽字符字符串WString,当然c++接口参数类型要使用wchar_t*,这样WString就可以无缝转wchar_t*了,不用做任何修改,也绝对不会乱码。

 

----END----


坚持写博客是一种美德

没有工匠精神的程序员不是一个好厨师

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值