Tag: fortran

从多个Java线程调用不可重入的本机共享库

我有一些Java代码调用一些本机代码,最初是用Fortran编写的,使用JNA。 (这是一个数值库,很多数学人员都在Fortran中进行编码。)它被编译成.so库,见下文: Fortran: https : //github.com/mizzao/libmao/tree/master/src/main/fortran Java绑定: https : //github.com/mizzao/libmao/blob/master/src/main/java/net/andrewmao/probability/MvnPackDirect.java 在我的代码中测试了所有单元,我得到了很好的结果,但后来我尝试使用来自多个线程的代码,一切都开始失败并出现奇怪的错误。 然后,我研究了一些关于重入Fortran代码的东西,并意识到我使用的库具有相当于一些全局变量(Fortran中的SAVE关键字,它记住了再次调用函数时变量的值: fortran SAVE语句 ) 现在我正在使用synchronized块包装对库的调用,但这显着地阻碍了性能。 在我看来,重新设计库是可重入的需要付出很大的努力(它有几千行数字代码,并且不清楚当子程序运行时值如何延续。)有谁知道解决问题的最佳方法是什么? 我的想象力表明…… 有没有办法让每个Java线程在内存中加载共享库的单独副本,以便全局变量实际上是线程本地的? 这有可能吗? 我不确定JNA的直接绑定或库绑定是如何工作的,如果有办法以这种方式使用它。 即使从不同的VM调用它,它仍然会被搞砸吗? 我该如何检查以确定? 有没有办法让gfortran ( gcc )以可重入的方式编译Fortran代码? 是否有一些快速而肮脏的方法使Fortran代码可以重入? 我搜索了RECURSIVE关键字,它显然将变量保存在堆栈中,但这似乎与现有代码不兼容。 还有其他可能的解决方 我确认多个虚拟机可以正常运行; 这是有道理的,因为他们不共享记忆。 仍然是一个PITA,但比线程更不方便。

从Java调用Fortran子例程

我有一个用Fortran编写的庞大的子程序,我需要在Java程序中使用它。 我怎么称呼它? 我使用的是ubuntu 10.04。

在java中运行fortran exe

尊敬的先生/女士, 我有一个fortran exe,它接受一个输入文件并通过对输入文件进行一些操作来生成输出文件。我能够在linux终端中运行命令。(我认为fortran编译器可以在linux中使用)。现在请建议如何运行这个fortran可执行文件使用java(在Linux机器上)。 我的尝试是, String cmd=”fortranExe arg1 arg2″; //fortranExe=exe path //arg1,arg2 are arguments to fortran executable program Process p=Runtime.getRuntime().exec(cmd); 但我没有得到输出。当我尝试运行Linux命令如ls时,dir正在提供输出。在java中运行fortran代码需要什么?