前段时间采用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、任何程序文件最好一个中文都不要用