tratando de hacer una DLL “palabra de saludo” en Visual Studio que Java Native Acceso aceptará

StackOverflow https://stackoverflow.com/questions/2421767

  •  19-09-2019
  •  | 
  •  

Pregunta

He compilado con éxito mi biblioteca en Linux y Mac y lo utilizó con Java acceso nativo. Por desgracia, nada de lo que hago parece funcionar con el compilador de Visual Studio y Java Native acceso.

Voy a volver a lo básico y tratar de crear un archivo DLL súper simple en Visual Studio que Java Native Access trabajar, cualquier ayuda se agradece.

A continuación se GimmeFiveDll.c:

__declspec(dllexport) int gimmeFive()
{
    return 5;
}

A continuación se SystemLibrary.java:

import com.sun.jna.Native;


public class SystemLibrary {

public static final SystemLibrary instance = new SystemLibrary();

    static {
        Native.register("GimmeFiveDll");
    }

    public native int gimmeFive();
}

Ya he intentado cambiar la interfaz de llamada a stdcall en Visual Studio. No hice ningún otro cambio de DLL proyecto por defecto de consola Win32 vacía el nuevo asistente de proyecto. En el ejemplo anterior la DLL resultante ni siquiera exportar la función correctamente de acuerdo con dumpbin.exe /exports. Mi proyecto real hace exportarlos correctamente pero de cualquier manera siempre me dan la misma excepción JNA:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'GimmeFiveDll': The specified module could not be found.

(Sí, puse el GimmeFiveDll.dll en System32. Sí soy capaz de utilizar JNA para acceder a otros archivos DLL en System32 que vienen con Windows).

Cualquiera que esté dispuesto a ayudarme a redondear este ejemplo minimalista de un DLL creado por Visual Studio que JNA gusta?

Muchas muchas gracias.

¿Fue útil?

Solución

Después de dos días de golpearme la cabeza contra una pared lo he descubierto. El problema era que C: \ Windows \ System32 NO es un directorio de System.loadLibrary () (que utiliza Native.register ()) puede cargar un archivo DLL de en una máquina de 64 bits! Así que en lugar JNA estaba aparentemente tratando de copiar la biblioteca en una ubicación temporal y cargarlo, pero que fracasó. El "módulo especificado no se pudo encontrar" el mensaje no era muy útil y me puso el camino equivocado: - \

De todos modos para responder a mi propia pregunta aquí es un ejemplo de un archivo DLL que se pueden construir con MSVC que Java (y JNA) se pueden utilizar (sólo hay que poner en el directorio correcto para su sistema!):

GimmeFiveDll.c:

#ifdef __cplusplus
#error no C++, to keep this example simple
#endif

__declspec(dllexport) int gimmeFive()
{
    return 5;
}

DllTest.java:

import com.sun.jna.Native;

public class DllTest {

    static {
        Native.register("GimmeFiveDll");
    }

    public static native int gimmeFive();

    public static void main(String[] args) {
        System.out.println("I got: " + DllTest.gimmeFive());
    }
}

Si todo va bien Java se imprimirá. "Tengo: 5"

Tenga en cuenta que no he encontrado la necesidad de cambiar la configuración del compilador utilizar stdcall o declarar __stdcall en la firma de la función. De hecho no se necesitaban cambios compilador del proyecto DLL normal de vacío que crea el asistente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top