使用JNI从java调用fortran dll

时间:2018-04-26 14:26:08

标签: java windows fortran java-native-interface

我在fortran中有一个带有简单void RESET()函数的Fifp.dll,并尝试从我的Java代码中调用它。 我做了一个简单的java测试类:

public class TestJni {

static {
    System.loadLibrary("Fifp");
}

public native void RESET();
}

我从中创建了一个.h文件,然后编译它。 我还制作了一个桥文件myBridge.c:

#include <stdio.h>
#include "TestJni.h"

extern void RESET();

JNIEXPORT void JNICALL Java_TestJni_RESET(JNIEnv *env, jobject obj) {
    printf("Before DLL call\n");
    RESET();
    printf("After DLL call\n");
}

现在我无法编译它。这是我在Visual Studio x64命令提示符中尝试的命令:

> cl -I"C:\path\to\jdk\include\win32" -I"C:\path\to\jdk\include" myBridge.c

并且还有-FeFifp.dll选项,它会给我同样的错误: LNK2019: unresolved external symbol RESET (and main)

那么我做错了什么?
是否有指定外部dll包含的选项?
我是否以正确的方式执行new TestJni().RESET()电话?

任何帮助表示赞赏...

1 个答案:

答案 0 :(得分:4)

  1. 为预构建的Fortran DLL准备Fifp.DEF文件。

    LIBRARY Fifp.dll 
    EXPORTS
      RESET
    
  2. 从DEF创建LIB。

    lib /def:Fifp.DEF /OUT:Fifp.lib
    
  3. 从myBridge.c和Fifp.LIB构建FifpBridge.dll。

    cl /LD myBridge.c /link Fifp.LIB
    
  4. 将Java语句更改为loadLibrary(&#34; FifpBridge&#34;)。该桥将在没有您干预的情况下加载Fortran DLL。

  5. 确保在运行时提供FifpBridge.dll和Fifp.dll。