JNA实现Java调用Fortran
在成功实现Java调用C++之后,接下来想到能否通过JNA实现Java调用Fortran,今天试验了一下,还是比较容易的。
网上有一个Java调用F95的例子,但是我考虑不仅要实现F95的调用,还要实现F77的调用,所以费了一些周折。
问题的关键在于F77为过程名自动添加了一个尾部的下划线,所以sub1这个过程,到Java一端,就变成了sub1_,知道了这一点,后面就简单了。
1、创建一个动态链接库项目FortranDLL,新建一个简单的fortran源程序for1.f:
subroutine sub1(i)
INTEGER i;
PRINT*, "SUB1 CALLED"
PRINT*, i
END subroutine
编译代码生成libFortranDLL.dll。
2、新建一个Java项目,包含JNA库
创建一个动态库接口代码FLib.java:
import com.sun.jna.Library;
import com.sun.jna.ptr.ByReference;
public interface FLib extends Library {
void sub1_(ByReference i);
}
创建一个主程序Main.java
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;
public class Main {
public static void main(String[] args) {
// Loading dynamically the library
FLib lib2 = (FLib) Native.loadLibrary("libFortranDLL", FLib.class);
IntByReference a = new IntByReference(1234);
lib2.sub1_(a);
}
}
注意,关键在于接口当中的sub_这个命名规则,否则无法找到找到指定过程,另外默认情况下,fortran使用引用参数,所以不能简单实用int作为参数,必须实用引用参数。
运行程序,得到如下结果:
run:
SUB1 CALLED
1234
成功生成(总时间:1 秒)
3、G95的调用更简单一些,可以直接使用bind指定输
相关文档:
数年前,当和一个软件团队一起用 Java 语言编写一个应用程序时,我体会到比一般程序员多知道一点关于 Java 对象序列化的知识所带来的好处。
大约一年前,一个负责管理应用程序所有用户设置的开发人员,决定将用户设置存储在一个 Hashtable 中,然后将这个 Hashtable 序列化到磁盘,以便持久化。当用户更改设置时,便重新将 ......
FileInputStream和FileOutputStream
FileInputStream :
用于顺序访问本地文件,用于读取诸如图像数据之类的原始字节流,从超类InputStream中继承了read,close等方法,对文件进行操作,不支持方法和方法.它的两个常用的构造方法是:
&nbs ......
第8章 多线程
本章目录
8.1 并发性、线程与多线程
8.2 获得线程体的两种方法
8.3 线程调度
8.1 并发性、线程与多线程
一、并发性的概念
目前的计算机操作系统大多支持并发性,即多个进程是交叉执行的,一般称多进程为系统级并发。
Java语言通过程序控制流来执行程序,单个的一段程序执行控制流称为线程。
多线 ......