llamando a la función c ++ desde Java usando swig en Windows, obteniendo java.lang.UnsatisfiedLinkError

Tengo este código c ++:

/* File : example.cpp */
#include <iostream>
#include <time.h>

double My_variable = 3.0;

int fact(int n) {
if (n <= 1) return 1;
else return n*fact(n-1);
}

int my_mod(int x, int y) {
return (x%y);
}

char *get_time()
{
time_t ltime;
time(&ltime);
return ctime(&ltime);
}          

y tengo este código .i:

/* example.i */
%module example
%{
/* Put header files here or function declarations like below */
extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();
%}

extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();

Estoy tratando de llamar a estas funciones desde Java. Entonces, en Windows 7 (con mingw) cmd hago:

swig -c++ -java example.i
g++ -c example.cpp example_wrap.cxx -I "C:\Program Files (x86)\Java\jdk1.8.0_31\include" -I "C:\Program Files (x86)\Java\jdk1.8.0_31\include\win32"
g++ -shared example.o example_wrap.o -o example.dll -I "C:\Program Files (x86)\Java\jdk1.8.0_31\include" -I "C:\Program Files (x86)\Java\jdk1.8.0_31\include\win32"

Esto crea un archivo dll. Ahora trato de ejecutar el siguiente programa de Java:

public class main {
   public static void main(String argv[]) {
     System.loadLibrary("example");
     System.out.println(example.fact(5));
     System.out.println(example.get_time());
   }
 }

Entonces corro

javac main.java

Se compila bien, pero cuando corro usando

java main

Me sale este error:

Exception in thread "main" java.lang.UnsatisfiedLinkError:     exampleJNI.fact(I)I
        at exampleJNI.fact(Native Method)
        at example.fact(example.java:20)
        at main.main(main.java:4)

¿Cuál es el problema?

Respuesta 1

Tenemos la necesidad de vincularnos al mismo puerto local al responder a las solicitudes. A continuación se muestra una muestra de código Java. En Linux podemos vincularnos al mismo puerto dos veces, pero en Windows obtenemos un error en el segundo enlace. ...

Tengo un javax.xml.datatype.Duration que contiene una fracción de milisegundos, por ejemplo, una duración de 1.5ms (1500 microsegundos): Duración duración = DatatypeFactory.newInstance (). NewDuration ("PT0.0015S"); ...

Estoy trabajando con una consulta para traer datos de acuerdo a un momento dado. así que quiero tomar una marca de tiempo y eliminar los últimos 3 dígitos. ¿Es posible? ¿cómo? dame una pista, apreciaré totalmente que

Tengo un problema con la visualización de imágenes en el GridPane. Recibí un error de que el flujo de entrada no debe ser nulo. La excepción está en la primera fila del objeto de creación de ImageView. Como puedes ver las fotos están en ...