windows - Ring fortran dll fra java ved hjælp af JNI

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en Fifp.dll i fortran med en simpel void RESET() funktion og forsøger at kalde det fra min Java kode.
Jeg lavede en simpel java test klasse:


public class TestJni {

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

public native void RESET();
}


Jeg lavede en .h-fil fra den og kompilerede den.
Jeg lavede også en brofil 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
");
    RESET();
    printf("After DLL call
");
}


Nu kan jeg ikke kompilere det. Dette er kommandoen, jeg prøvede i en Visual Studio x64-kommandoprompt:


> cl -I"C:path	ojdkincludewin32" -I"C:path	ojdkinclude" myBridge.c


og også med en -FeFifp.dll mulighed giver det mig den samme fejl:
LNK2019: uløst eksternt symbol RESET (og hoved) [10]


Så hvad gør jeg forkert?

Er der mulighed for at angive den eksterne dll til at omfatte?

Er jeg på den rigtige måde at udføre new TestJni().RESET() opkaldet?


Enhver hjælp værdsat ...

Bedste reference



  1. Klargør en FIFP.DEF-fil til den præbyggede Fortran DLL.


    LIBRARY Fifp.dll 
    EXPORTS
      RESET
    

  2. Opret LIB fra DEF.


    lib /def:Fifp.DEF /OUT:Fifp.lib
    

  3. Byg FifpBridge.dll fra myBridge.c og Fifp.LIB.


    cl /LD myBridge.c /link Fifp.LIB
    

  4. Skift Java-sætningen til loadLibrary ('FifpBridge'). Broen vil indlæse Fortran DLL uden din intervention.

  5. Sørg for, at både FifpBridge.dll og Fifp.dll er tilgængelige på kørselstidspunktet.