bigbear

JNA实现Java调用Fortran(f77)

在成功实现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指定输出过程(函数)名,可以完全不必考虑编译器的命名规则,比f77的方式可移植性更好一些。

可以参考这里:http://www.javaforge.com/wiki/66061

posted on 2010-05-12 22:05 大熊 阅读(3075) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: