Chinaunix首页 | 论坛 | 博客
  • 博客访问: 174313
  • 博文数量: 17
  • 博客积分: 299
  • 博客等级: 下士
  • 技术积分: 292
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-24 12:11
文章分类
文章存档

2017年(1)

2013年(1)

2012年(15)

我的朋友

分类: Java

2012-03-28 10:46:05

在java中调用fortran的 code时,需要将fortran函数通过mingw等工具制作成.dll格式,然后使用JNA来引用。

mingw下gfortran的编译命令参数如下:

$gfortran.exe -fPIC -fno-underscoring -c -g -o mult.o mult.f 
$gfortran.exe -shared -mrtd -o mult.dll mult.o

(如果有dll找不到,可以将其所在目录加入到PATH变量当中。)

 

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
import com.sun.jna.ptr.*;

/*
*/
public class NJNA {
    public interface F95XXXX extends Library {

        F95XXXX lib = (F95XXXX) Native.loadLibrary("mult.dll", F95XXXX.class);

            void f_str(String []arr, int  num);
            boolean foostr(String arr, int [] num, FloatByReference f);
            int foomult(int a, int b);
            void prtstr(String[] str, int num);

    }
    public static void main(String[] args) throws Exception{

        //System.load("E:\\temp\\mult.dll");
            NativeLibrary.addSearchPath("mult.dll", "E:\\TEMP");

            String[] c = {"31", "32", "33", "abc", "1222323e"};
            int cref=c.length;
            F95XXXX.lib.f_str(c, cref);
            System.out.println("output from f_str:");
            for (int i=0;i                System.out.println(c[i]);
            System.out.println("output of foostr");
    }

}

如上,mult.dll是fortran的dll库,放在e:\temp下。

在使用中出现:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'mult.dll': ???????¨
    at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:166)
    at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:239)
    at com.sun.jna.Library$Handler.(Library.java:140)

这个错误是什么原因呢?

在      NativeLibrary.addSearchPath("mult.dll", "E:\\TEMP");

前面添加

System.load("E:\\temp\\mult.dll");

报告:

UnsatisfiedLinkError: E:\temp\mult.dll: Can't find dependent libraries.

这个呢,使用工具dependency walker 查看,报告以下错误:

 

1

 

因为mult.dll由mingw生成,所以缺少了两个mingw的库:

LIBGCC_S_DW2-1.DLL,LIBGFORTRAN-3.DLL。

将这两个库复制到e:\temp下,错误消失。

阅读(4379) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

ma.yu2012-03-28 09:13:59

煜轩: 这个错误是什么原因呢?.....
??
在这个例子中,mult.dll依赖LIBGCC_S_DW2-1.DLL,LIBGFORTRAN-3.DLL,但是在搜索路径e:\temp下没有这两个文件。所以复制过去后就可以解决这个问题。

煜轩2012-03-27 22:40:55

这个错误是什么原因呢?