本帖最后由 jiangyb_matlab 于 2017-12-18 11:27 编辑
实验目的
把Matlab编写函数导出Java的Jar包,在没有GUI的Linux服务端使用。
经过试验发现:
(1) 在osx导出的jar包,在Linux下是可以使用的,因为matlab函数最终是被编译成为跨平台的ctf文件。
(2) Matlab和Matlab Runtime的版本必须严格相同,此外java的版本最好一致,比如编译环境是java8,运行环境也最好是java8。
(3) 到目前为止,在Linux下测试plot函数,目前尚未试验出结果,即使在GUI环境下也失败,主要是Java的JNI调用OpenGL出现很多问题,很难配置成功;不过好在,我们是做服务端开发的,不需要绘图,也不需要GUI。
1. 编写Matlab函数文件plotsin.m
function out=plotsin(first,step,last)
in=first:step:last;
out=sin(in);
end
2. 导出Jar Library
image.png (168.55 KB, 下载次数: 1)
2017-12-18 11:26 上传
最终得到plotsin/for_redistribution_files_only/plotsin.jar
3. Centos下测试
(1) MCR安装
unzip MCR_R2017b_glnxa64_installer.zip
./install -mode silent -agreeToLicense yes
(2) 设置环境变量
vi ~/.bashrc增加
export LD_LIBRARY_PATH=/usr/local/MATLAB/MATLAB_Runtime/v93/runtime/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v93/bin/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v93/sys/os/glnxa64
(3) 安装opengl
yum install mesa-libGLw.x86_64
备注:
如果不安装opengl会报错误:
------------------------------------------------------------------------
std::terminate() detected at Sun Dec 17 10:54:48 2017
------------------------------------------------------------------------
Configuration:
Crash Decoding : Disabled - No sandbox or build area path
Crash Mode : continue (default)
Default Encoding : UTF-8
GNU C Library : 2.17 stable
Host Name : localhost.localdomain
MATLAB Architecture : glnxa64
MATLAB Root : /usr/local/MATLAB/MATLAB_Runtime/v93
MATLAB Version : 9.3.0.713579 (R2017b)
Operating System : Linux 3.10.0-693.11.1.el7.x86_64 #1 SMP Mon Dec 4 23:52:40 UTC 2017 x86_64
Processor ID : x86 Family 6 Model 70 Stepping 1, GenuineIntel
(4) 安装jdk
jdk的版本最好严格匹配(大版本号、64位或),在matlab命令行中允许version -java,找到响应的jdk版本,然后oracle官网下载指定的版本。
安装完毕设置环境变量:
export JAVA_HOME=/home/jiangyb/apps/java/jdk1.8.0_121
export PATH=$PATH:$JAVA_HOME/bin
(5) 测试用例
import plotsin.*;
public class Main {
public static void main(String[] args) {
try {
// System.setProperty("java.library.path","/Applications/MATLAB_R2017a.app/runtime/maci64/libmwmclmcrrt");
PlotClass plot = new PlotClass();
Object [] result=plot.plotsin(1, -2*Math.PI, 0.1f, 2 * Math.PI);
System.out.println(result.length);
} catch (Exception e) {
e.printStackTrace();
}
}
}
(6) 编译
javac -cp /usr/local/MATLAB/MATLAB_Runtime/v93/toolbox/javabuilder/jar/javabuilder.jar:lib/plotsin.jar -d bin/ src/Main.java
备注:这里的lib/plotisn.jar就是刚才导出的jar包。/usr/local/MATLAB/MATLAB_Runtime/v93/toolbox/javabuilder/jar/javabuilder.jar则是安装完毕运行的jar包目录。
(7) 运行
java -cp bin:/usr/local/MATLAB/MATLAB_Runtime/v93/toolbox/javabuilder/jar/javabuilder.jar:lib/plotsin.jar Main
(8) 输出结果
1 至 7 列
-6.2832 -6.1832 -6.0832 -5.9832 -5.8832 -5.7832 -5.6832
8 至 14 列
-5.5832 -5.4832 -5.3832 -5.2832 -5.1832 -5.0832 -4.9832
15 至 21 列
-4.8832 -4.7832 -4.6832 -4.5832 -4.4832 -4.3832 -4.2832
22 至 28 列
-4.1832 -4.0832 -3.9832 -3.8832 -3.7832 -3.6832 -3.5832
29 至 35 列
-3.4832 -3.3832 -3.2832 -3.1832 -3.0832 -2.9832 -2.8832
36 至 42 列
-2.7832 -2.6832 -2.5832 -2.4832 -2.3832 -2.2832 -2.1832
43 至 49 列
-2.0832 -1.9832 -1.8832 -1.7832 -1.6832 -1.5832 -1.4832
50 至 56 列
-1.3832 -1.2832 -1.1832 -1.0832 -0.9832 -0.8832 -0.7832
57 至 63 列
-0.6832 -0.5832 -0.4832 -0.3832 -0.2832 -0.1832 -0.0832
64 至 70 列
0.0168 0.1168 0.2168 0.3168 0.4168 0.5168 0.6168
71 至 77 列
0.7168 0.8168 0.9168 1.0168 1.1168 1.2168 1.3168
78 至 84 列
1.4168 1.5168 1.6168 1.7168 1.8168 1.9168 2.0168
85 至 91 列
2.1168 2.2168 2.3168 2.4168 2.5168 2.6168 2.7168
92 至 98 列
2.8168 2.9168 3.0168 3.1168 3.2168 3.3168 3.4168
99 至 105 列
3.5168 3.6168 3.7168 3.8168 3.9168 4.0168 4.1168
106 至 112 列
4.2168 4.3168 4.4168 4.5168 4.6168 4.7168 4.8168
113 至 119 列
4.9168 5.0168 5.1168 5.2168 5.3168 5.4168 5.5168
120 至 126 列
5.6168 5.7168 5.8168 5.9168 6.0168 6.1168 6.2168
1
好了,总算调试通过了,下一步我准备在OSGi环境下使用。我们目前的分布式计算是基于OSGi环境的。