Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用JNI实现Fortran代码与Java的集成_Java_C_Java Native Interface_Fortran_Gfortran - Fatal编程技术网

用JNI实现Fortran代码与Java的集成

用JNI实现Fortran代码与Java的集成,java,c,java-native-interface,fortran,gfortran,Java,C,Java Native Interface,Fortran,Gfortran,我对JNI将Fortran代码与Java集成有一个问题。 当我将C对象与Fortran对象链接时,可能会出现这个问题 文件:HelloWorld.java public class HelloWorld { native void foo(); static { System.loadLibrary("test"); } static public void main(String argv[]) { new HelloWorld(

我对JNI将Fortran代码与Java集成有一个问题。 当我将C对象与Fortran对象链接时,可能会出现这个问题

文件:HelloWorld.java

public class HelloWorld {
    native void foo();
    static {
        System.loadLibrary("test");
    }
    static public void main(String argv[]) {
        new HelloWorld().foo();
    }
}
文件:ctest.c

#include <jni.h>
#include <stdio.h>

extern void bar_();

JNIEXPORT void JNICALL Java_HelloWorld_foo
  (JNIEnv * env, jobject jobj)
{
    printf("Hello World!\n");
}
好极了,
你好,世界工作正常。
但当我添加Fortran代码时,Java抛出了一个异常

文件:ftest.f95

subroutine bar()
    return
end
汇编:

$ gcc -fPIC -shared -lc \
    -I/usr/lib/jvm/java-7-oracle/include \
    -I/usr/lib/jvm/java-7-oracle/include/linux \
    -o libtest.so ctest.c
$ javac HelloWorld.java
$ java HelloWorld
Hello World!
$ gcc -fPIC -shared -lc \
    -I/usr/lib/jvm/java-7-oracle/include \
    -I/usr/lib/jvm/java-7-oracle/include/linux \
    -o ctest.o ctest.c
$ gfortran -c ftest.f95
$ gcc -shared ftest.o ctest.o -o libtest.so
$ javac HelloWorld.java
$ java HelloWorld
Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloWorld.foo()V
        at HelloWorld.foo(Native Method)
        at HelloWorld.main(HelloWorld.java:7)
我做错了什么?

有几件事:

  • 对于C对象的构建,不应指定
    -shared
    。您没有生成独立的库。相反,使用
    -c
    编译对象:
  • 如果要将C和Fortran对象链接在一起,则需要在这两种情况下以及链接库时指定
    -fPIC
    。此外,您需要链接到
    libgfortran
  • 您需要扩展
    java.library.path
    ,以便JVM可以找到库:

使用这些命令,您的代码在我的机器上运行良好

我发现,解决方案是
ld

gcc -fPIC -shared -lc \
    -I/usr/lib/jvm/java-7-oracle/include \
    -I/usr/lib/jvm/java-7-oracle/include/linux \
    -o ctest.o ctest.c
gfortran -c ftest.f95
ld -shared ftest.o ctest.o -o libtest.so -lc

java java < /COD>在编译时完全相同吗?是的,<代码> HeloWord。Java < /C>完全相同。它允许您将Java代码直接映射到FORTRAN共享库,而无需任何额外的本机代码编译。
gfortran-fPIC-shared ftest.o ctest.o-o libtest。因此
可能也可以工作,并且稍微简单一些。
gfortran -fPIC -c ftest.f95
gcc -fPIC -shared ftest.o ctest.o -o libtest.so -lgfortran
javac HelloWorld.java
java -Djava.library.path="$PWD" HelloWorld
gcc -fPIC -shared -lc \
    -I/usr/lib/jvm/java-7-oracle/include \
    -I/usr/lib/jvm/java-7-oracle/include/linux \
    -o ctest.o ctest.c
gfortran -c ftest.f95
ld -shared ftest.o ctest.o -o libtest.so -lc