Salut!
J'essaie d'appeler une fonction fortran tout simple à partir du Java en utilisant du JNI et un wrapper de C. Sous Windows cela marche, mais pas sous Linux, et je ne comprends vraiment pas pourqoi. J'estime que c'est un problème du compilateur,...
Le message d'erreur est:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
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)
Le programme Fortran est:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
SUBROUTINE essai()
 
	write(*,*) "coucou en Fortran"
 
	return
 
	END SUBROUTINE essai
Le programme Java est:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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");
    }
 
}
et le programme C:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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;
}

Pour compiler et éxécuter j'ai utilisé les commandes suivantes:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
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
Sous Windows j'ai utilisé encore un fichier .def, mais normalement sous Linux, on n'en a pas besoin.
J'ai regardé partout, mais je suis arrivée à mes limites, si quelqu'un a un clou, je serais super contente.
Merci en avance,
Sonja