Sta*_*ski 5 c java 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().foo();
}
}
Run Code Online (Sandbox Code Playgroud)
文件: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");
}
Run Code Online (Sandbox Code Playgroud)
汇编:
$ 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!
Run Code Online (Sandbox Code Playgroud)
非常好,Hello World!工作正常。但是当我添加 Fortran 代码时,Java 抛出异常。
文件:ftest.f95
subroutine bar()
return
end
Run Code Online (Sandbox Code Playgroud)
汇编:
$ 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)
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
有几件事:
-shared. 您没有生成一个独立的库。相反,使用-c编译对象:gcc -fPIC -lc \
-I/usr/lib/jvm/java-7-oracle/include \
-I/usr/lib/jvm/java-7-oracle/include/linux \
-o ctest.o -c ctest.c
Run Code Online (Sandbox Code Playgroud)
-fPIC在两种情况下以及链接库时进行指定。此外,您需要链接到libgfortran:gfortran -fPIC -c ftest.f95
gcc -fPIC -shared ftest.o ctest.o -o libtest.so -lgfortran
Run Code Online (Sandbox Code Playgroud)
java.library.pathJVM 才能找到该库:javac HelloWorld.java
java -Djava.library.path="$PWD" HelloWorld
Run Code Online (Sandbox Code Playgroud)
使用这些命令,您的代码在我的机器上运行良好。
| 归档时间: |
|
| 查看次数: |
781 次 |
| 最近记录: |