Вызов Fortran DLL из Java с использованием JNI - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть Fifp.dll в Фортране с простой функцией void RESET() и я пытаюсь вызвать его из моего кода 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: неразрешенный внешний символ RESET (и основной)

Так что я делаю не так?
Есть ли возможность указать внешнюю DLL для включения?
Правильно ли я выполняю вызов new TestJni().RESET()?

Любая помощь приветствуется ...

1 Ответ

0 голосов
/ 26 апреля 2018
  1. Подготовьте файл Fifp.DEF для предварительно созданной библиотеки Fortran DLL.

    LIBRARY Fifp.dll 
    EXPORTS
      RESET
    
  2. Создание LIB из DEF.

    lib /def:Fifp.DEF /OUT:Fifp.lib
    
  3. Сборка FifpBridge.dll из myBridge.c и Fifp.LIB.

    cl /LD myBridge.c /link Fifp.LIB
    
  4. Измените инструкцию Java на loadLibrary ("FifpBridge"). Мост загрузит библиотеку Fortran DLL без вашего вмешательства.

  5. Убедитесь, что FifpBridge.dll и Fifp.dll доступны во время выполнения.
...