使用JNI从Java调用fortran dll

Tie*_*rce 1 java windows java-native-interface fortran

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

public class TestJni {

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

public native void RESET();
}
Run Code Online (Sandbox Code Playgroud)

我从中制作了一个.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");
}
Run Code Online (Sandbox Code Playgroud)

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

> cl -I"C:\path\to\jdk\include\win32" -I"C:\path\to\jdk\include" myBridge.c
Run Code Online (Sandbox Code Playgroud)

并且还有一个-FeFifp.dll选项,它给了我相同的错误: LNK2019:无法解析的外部符号RESET(和main)

那么我在做什么错呢?
是否可以指定要包含的外部dll?
我是否以正确的方式执行new TestJni().RESET()呼叫?

任何帮助表示赞赏...

Ale*_*ohn 5

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

    LIBRARY Fifp.dll 
    EXPORTS
      RESET
    
    Run Code Online (Sandbox Code Playgroud)
  2. 从DEF创建LIB。

    lib /def:Fifp.DEF /OUT:Fifp.lib
    
    Run Code Online (Sandbox Code Playgroud)
  3. 从myBridge.c和Fifp.LIB构建FifpBridge.dll。

    cl /LD myBridge.c /link Fifp.LIB
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将Java语句更改为loadLibrary(“ FifpBridge”)。该桥将在无需您干预的情况下加载Fortran DLL。

  5. 确保FifpBridge.dll和Fifp.dll在运行时都可用。