Llamando a C ++ dll desde Java

Estoy usando Java para una aplicación pequeña. Es una reescritura de un proyecto MFC existente. Existe una dll existente que necesito cambiar para habilitar el acceso desde Java usando JNI. Todas estas cosas de Java son nuevas para mí, así que estoy teniendo un pequeño problema y me siento bastante denso cuando leo otras publicaciones en el foro. En el dll existente tengo una función como esta:

extern "C" __declspec(dllexport) bool Create() { return TRUE; } 

Tiempo tonto de preguntas ¿Cómo configuro correctamente para ser llamado por Java?

Intenté esto:

 JNIEXPORT jboolean JNICALL Create() { return TRUE; } 

Estoy incluyendo jni.h y todo comstack bien. Sin embargo, cuando lo llamo desde Java obtengo UnsatisfiedLinkError. Lo estoy llamando desde Java usando esto:

 public static native boolean CreateSession(); System.load("D:\\JavaCallTest.dll"); Create(); 

¿Podría alguien amablemente empujarme en la dirección correcta? Agradezco sinceramente cualquier ayuda.

Gracias,

Mella

Debe incluir el nombre y la ruta de la clase Java en su código nativo, por ejemplo, si su método nativo fue declarado en Java como:

 public class NativeCode { public static native boolean CreateSession(); } 

y la ruta de clase era (por ejemplo) com.example.NativeCode declararía su método en nativo de la siguiente manera:

 extern "C" JNIEXPORT jboolean JNICALL Java_com_example_NativeCode_CreateSession(JniEnv* env, jclass clazz) { return JNI_TRUE; } 

Todos los métodos JNI tienen un puntero y clase JNIEnv como sus primeros dos parámetros.

Un método nativo estático todavía necesita al menos dos parámetros:

 JNIEnv *env jclass clazz 

El nombre de la función también debe corresponderse con la estructura del paquete java.

 JNIEXPORT jboolean JNICALL Java_com_example_CreateSession(JNIEnv *env, jclass clazz) 

Lo ideal sería usar la herramienta javah para crear un archivo de cabecera de la clase java que declare el método nativo y luego implementar los prototipos de función declarados.

Tuve un problema similar: una C-Codebase existente a la que necesitaba acceder desde Java. Para mí, valió la pena, familiarizarme con SWIG , una herramienta para generar una DLL intermedia de C ++ (que llama al C-Code), más código Java que llama al DLL de C ++.

Si tiene más que solo 1 función de la DLL para envolver, podría ser útil echarle un vistazo a esta herramienta, de lo contrario, debería familiarizarse con JNI …

EDITAR :

Parece que tu DLL no es encontrada por la llamada a System.load() . Es posible que desee probar System.loadLibrary() , pero tenga en cuenta que su archivo DLL debe ubicarse en la ruta indicada por la propiedad java.library.path sistema Java. Además, no pase el nombre de archivo completo en este caso, solo el nombre de archivo sin extensión.