分类: 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("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.
…
这个错误是什么原因呢?
在 NativeLibrary.addSearchPath("mult.dll", "E:\\TEMP");
前面添加
System.load("E:\\temp\\mult.dll");
报告:
UnsatisfiedLinkError: E:\temp\mult.dll: Can't find dependent libraries.
这个呢,使用工具dependency walker 查看,报告以下错误:
因为mult.dll由mingw生成,所以缺少了两个mingw的库:
LIBGCC_S_DW2-1.DLL,LIBGFORTRAN-3.DLL。
将这两个库复制到e:\temp下,错误消失。