前言
关于JNA入门教程,环境搭建非常简单,网上资料也非常多,这里就不在赘述了。
简单讲JNA就是针对java调用C++动态库开发的jar包程序,使java调用c++动态库变得非常简单
JNA主要负责:
- 接口调用 - 将C++接口转化成java方法
- 参数转化 - 将C++类型参数转化成java数据类型
解决JNA乱码
在JNA开发过程中,中文乱码应该占据了全部问题的70%,前阵子终于下定决心,彻底根治。网上关于此问题解释也挺多,不过很多解决方法其实是有问题的。
乱码出现原因:
JNA在对c++的char*和JAVA的String进行互相转换时候,针对C++字符数组编码设定错误导致
网上常见解决办法:
- 各种修改eclipse、Tomcat字符编码(治标不治本)
- 各种折腾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----
坚持写博客是一种美德
没有工匠精神的程序员不是一个好厨师