Hallo!
Ich versuche unter Linux eine einfache Fortran Funktion in Java aufzurufen. Ich verwende dazu JNI und eine C-Funktion als Wrapper. Auf Windows läuft das Programm, aber auf Linux bekomme ich folgende Fehlermeldung:
Das Fortran Programm sieht folgendermaßen aus:
Das Java Programm wie folgt:
und das C-Programm so:
Zum kompilieren und executieren habe ich folgende Befehle verwendet:
Unter Windows habe ich noch ein .def File verwendet, aber das wird in Linux eigentlich nicht benötigt. Ich habe schon alles im Netz abgesucht, aber nicht wirklich was gefunden. Ich glaube allerdings, dass es irgendwie mit dem Kompiler zusammenhängen muss. Es wäre super wenn mir einer von Euch weiterhelfen könnte!
Sonja
Ich versuche unter Linux eine einfache Fortran Funktion in Java aufzurufen. Ich verwende dazu JNI und eine C-Funktion als Wrapper. Auf Windows läuft das Programm, aber auf Linux bekomme ich folgende Fehlermeldung:
Code:
Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/alban/lib/libessf.so: /home/alban/lib/libessf.so: undefined symbol: _gfortran_filename
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1751)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1676)
at java.lang.Runtime.loadLibrary0(Runtime.java:822)
at java.lang.System.loadLibrary(System.java:992)
at LoadLib.<clinit>(LoadLib.java:24)
Das Fortran Programm sieht folgendermaßen aus:
Code:
SUBROUTINE essai()
write(*,*) "coucou en Fortran"
return
END SUBROUTINE essai
Das Java Programm wie folgt:
Code:
import java.io.*;
public class LoadLib {
/** Creates a new instance of WRubar20 */
//public LoadLib() { }
public static native void f1();
static {System.loadLibrary("essf"); }
public static void main (String args [ ])
{
System.out.println("aller, je commence en Java\n");
new LoadLib().f1();
System.out.println("ca y est, j'ai fini en Java\n");
}
}
und das C-Programm so:
Code:
#include<stdio.h>
#include<jni.h>
#include"LoadLib.h"
extern void essai_();
JNIEXPORT void JNICALL Java_LoadLib_f1 (JNIEnv * env, jclass cl)
{
printf("coucou en C\n");
essai_();
return;
}
Zum kompilieren und executieren habe ich folgende Befehle verwendet:
Code:
javac LoadLib.java
javah -jni LoadLib
gcc -c sub.f
JNI=/usr/lib/jvm/java-1.5.0-sun-1.5.0.06/include
JNI_LINUX=/usr/lib/jvm/java-1.5.0-sun-1.5.0.06/include/linux
gcc -c -I$JNI -I$JNI_LINUX LoadLib.c
gcc -o libessf.so -shared -I$JNI -I$JNI_LINUX sub.o LoadLib.o -lg2c
java LoadLib
Unter Windows habe ich noch ein .def File verwendet, aber das wird in Linux eigentlich nicht benötigt. Ich habe schon alles im Netz abgesucht, aber nicht wirklich was gefunden. Ich glaube allerdings, dass es irgendwie mit dem Kompiler zusammenhängen muss. Es wäre super wenn mir einer von Euch weiterhelfen könnte!
Sonja