Estoy tratando de usar JNI y obtener java.lang.UnsatisfiedLinkError. A diferencia de las otras millones de preguntas que se hacen al respecto, tengo la lib en mi camino e incluso he visto cambiar la excepción cuando la elimino. Estoy seguro de que algo está mal con el dll que he creado, pero no estoy seguro de qué.JNI: la biblioteca se encuentra en la ruta, pero el método no es (java.lang.UnsatisfiedLinkError)
Aquí está mi código de clase Java:
package com;
public class Tune {
static {
System.loadLibrary("lala");
}
public static void main(String[] args) {
Tune j = new Tune();
System.out.println("2+6="+j.add(2, 6));
}
native public int add(int x,int y);
}
Aquí es la parte abreviada de mi javah archivo de cabecera producido:
/*
* Class: com_Tune
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_Tune_add
(JNIEnv *, jobject, jint, jint);
Aquí está mi código C++:
#include <jni.h>
#include <com_Tune.h>
JNIEXPORT jint JNICALL Java_com_Tune_add
(JNIEnv * env, jobject obj, jint x, jint y) {
return x+y;
}
Aquí está la excepción de tiempo de ejecución que recibo de eclipse:
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.Tune.add(II)I
at com.Tune.add(Native Method)
at com.Tune.main(Tune.java:9)
He leído que la excepción anterior significa que encontró la biblioteca "lala", pero que el método "agregar" todavía no está definido. Las únicas cosas que veo diferente entre mi proyecto y el tutorial son:
- mina usa un paquete, en lugar del paquete por defecto (no deben tutoriales realmente hacer esto vamos vamos profesional?!?!)
- La mina tiene un valor de retorno.
- Moví DLL después de su creación (no creo que esto va a romper ya está configurado mi camino.)
¿Cómo es esto posible?
Otra Info:
SO: Windows 7
JDK: 1.6.0_31 (para x86, JVM de 32 bits)
C++ IDE: Code :: Blocks (se compiló el DLL automáticamente por el Código :: Blocks IDE)
C++ compilador: MinGW32-g ++ (la GNU C++ compilador)
tengo jni.h y com_Tune.h en C: \ _ \ incluir
I tienen lala.dll en C: \ _ \ lib
Variables de entorno:
RUTA: C: \ Archivos de programa (x86) \ NVIDIA Corporation \ PhysX \ Common;% CommonProgramFiles% \ Microsoft Shared \ Windows Live; C: \ Archivos de programa (x86) \ AMD APP \ bin \ x86_64; C : \ Archivos de programa (x86) \ AMD APP \ bin \ x86;% SystemRoot% \ system32;% SystemRoot%;% SystemRoot% \ System32 \ Wbem;% SYSTEMROOT% \ System32 \ WindowsPowerShell \ v1.0 \; C: \ Program Archivos (x86) \ ATI Technologies \ ATI.ACE \ Core-Static; C: \ Apps;% JAVA_HOME% \ bin; C: \ Archivos de programa \ MySQL \ MySQL Server 5.5 \ bin;% MAVEN_HOME% \ bin;% HADOOP_INSTALL% \ bin; c: \ Archivos de programa (x86) \ Microsoft SQL Server \ 100 \ Tools \ Binn \; c: \ Archivos de programa \ Microsoft SQL Server \ 100 \ Tools \ Binn \; c: \ Archivos de programa \ Microsoft SQL Server \ 100 \ DTS \ Binn \; C: \ MinGW \ bin; C: \ Archivos de programa (x86) \ GnuWin32 \ bin; C: _ \ ruta; C: \ _ \ lib; C: \ Archivos de programa (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin; C: \ _ \ include
el código parece correcto. ¿Podría verificar la tabla de exportación de DLL (es decir, con Dependency Walker) y asegurarse de que su función esté presente en las exportaciones? – Mersenne