Have fun with sci.dog

MATLAB编译Java SDK的中文注释错误

前段时间采用matlab开发的一个项目要在网络上调用,网络端后台是用java开发的,因此,这里的思路是把matlab函数编译为java包,让java去调用。

1、安装java

2、设置java的环境变量,让javac能被访问到,matlab编译包需要调用javac

完成这两部后进行编译,报错了。

 编码 GBK 的不可映射字符 (0x80)

解决办法一:把中文注释都删除,笔者一次性打包了许多函数,为了搞清楚是哪个函数,可以用mcc单独编译每个函数,去测试,这办法很笨,这里就不用了。直接说

解决办法二:

网上调查后,发现只需要给javac 加一个参数就行,

Java编辑提示错误: 编码 GBK 的不可映射字符 (0x80) – JaceyKan – 博客园 (cnblogs.com)

javac -encoding UTF-8 XX

用这个就可以解决不识别中文编码的问题了。但问题是,这个参数没法加给matlab,matlab只会用javac,而不会使用javac -encoding UTF-8,笔者又想到可以把javac重命名为javacc,然后写一个javac的bat脚本去调用javacc,这样matlab执行javac的时候,就可以执行javacc -encoding UTF-8了,问题是如何将后边的参数传给javacc,我们知道,bat脚本输入参数是%1,%2,…%9,但怎么把后续的所有参数全部给bat脚本呢?经过查询,应该用%*

How can I pass arguments to a batch file? – Stack Overflow

ok,脚本javac.bat内容为

javacc -encoding UTF8 %*

ok,这下子应该没问题了吧,测试下

mcc -W 'java:包名:类名' -T link:lib -d 编译后包路径 'class{DRPA:函数文件.m}'

出现的错误为

javacc -encoding UTF8 -classpath "C:\Program Files\MATLAB\R2021b\toolbox\javabuilder\jar\javabuilder.jar" -d "E:\complier\for_testing\classes" "E:\complier\for_testing\DRPA.java" "E:\complier\for_testing\DRPAPLATMCRFactory.java" "E:\complier\for_testing\DRPARemote.java" "E:\complier\for_testing\package-info.java"  
正在加载程序包DRPAPLAT的源文件... 
E:\repos\complier\for_testing\DRPA.java:147: 错误: 编码GBK的不可映射字符
* % histroty:鍙?
The following command: 
""javadoc" -d "E:\gouff\repos\DRPAPLAT\complier\DRPAPLAT\for_testing\doc\html" -sourcepath "E:\gouff\repos\DRPAPLAT\complier\DRPAPLAT\for_testing" -classpath "C:\Program Files\MATLAB\R2021b\toolbox\javabuilder\jar\javabuilder.jar" DRPAPLAT" 
failed with error code 1. 
This may occur if Java is not installed, or incorrectly installed, or not on the system path, 
or if the environment variable JAVA_HOME is set to an incorrect value. 

matlab成功调用了javacc -encoding UFT-8,但是还是出错,非常奇怪!

难道要放弃,采用方法一吗?No.咱们继续刚!

这里可以看到matlab编译java包的方式

matlab在for_testing目录下生成了3个java文件和1个ctf文件,然后用javac命令去打包这3个java文件为jar文件。

但是由于调用javac出错,失败,因此matlab又把这几个文件给删除了。。。看到这里后,我考虑应该还是matlab调用javacc -encoding UTF8的时候出了问题。

那么思路就是咱们获取这个3个java文件后,自己用命令行打包jar,因此我们可以在matlab生成这3个java文件后测试失败前的时候,用cp命令半路截胡,别让它给删除了。

code *.java .\test

这里有多种办法,

  • 可以在生成文件的一瞬间,直接cp命令
  • 可以写个while cp的脚本,持续执行
  • 可以限定文件夹的权限,只让matlab写入,不让删除。。。

总之,得到这3个文件后,使用javac或者javacc -encoding UTF8编译,都可以得到正确的jar包!

问题解决,经验总结如下:

1、任何程序文件最好都使用utf-8编码格式

2、任何程序文件最好一个中文都不要用

赞(0)
未经允许不得转载:SciDog » MATLAB编译Java SDK的中文注释错误

评论 抢沙发