Fortran Code Integration with Java JNI

I have a problem integrating Fortran code with Java JNI. The problem probably occurs when I bind a C object to a Fortran object.

File: HelloWorld.java

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

File: 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");
}

Compilation:

$ 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!

Great, it Hello World!works correctly. But when I add Fortran code, Java throws an exception.

File: ftest.f95

subroutine bar()
    return
end

Compilation:

$ 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)

What am I doing wrong?

+4
source share
2 answers

A few things:

  • You must not specify to build the C object -shared. You are not creating an independent library. Instead, use -cto compile the object:
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
  • C Fortran, -fPIC . , libgfortran:
gfortran -fPIC -c ftest.f95
gcc -fPIC -shared ftest.o ctest.o -o libtest.so -lgfortran
  • java.library.path, JVM :
javac HelloWorld.java
java -Djava.library.path="$PWD" HelloWorld

.

+2

, 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
0

Source: https://habr.com/ru/post/1616960/


All Articles