¿Cómo hago que el método JNI no llame estático cuando se usan objetos nativos de C ++?

Tengo el código siguiente del envoltorio de JNI C ++:

#include "map_container.h" extern "C" { JNIEXPORT void JNICALL Java_com_map_Map_openMapNative(JNIEnv* env, jobject thiz, jstring path); }; static map_container* map = NULL; void Java_com_map_Map_openMapNative(JNIEnv* env, jobject thiz, jstring path) { const char* filename_utf8 = env->GetStringUTFChars(path, false); if ( mapview ) { delete mapview; mapview = NULL; } mapview = new map_container((char*)filename_utf8); if (filename_utf8) { env->ReleaseStringUTFChars(path, filename_utf8); } } 

Y han com.map.Map.openMapNative declarado como estático, lo que significa que puedo operar un mapa a la vez. ¿Cómo puedo modificar este código C ++ para que map_container* map no se convierta en estático y pertenezca a la instancia exacta de la clase com.map.Map ? map_container es totalmente clase C ++ y no tiene ninguna reflexión en Java.

Estoy usando SWIG para generar todo el código de envoltura necesario. Simplemente defina las clases y las funciones que desee insertar en un archivo de definición de interfaz, y deje que SWIG cree todo el código C ++ y Java requerido para usted. ¡Muy recomendable! Escribir código JNI a mano es simplemente demasiado aburrido y propenso a errores IMHO. Consulte los documentos SWIG para Java , es muy fácil de usar.

Si ha declarado Map.openMapNative como "nativo estático" en el origen Java, entonces la declaración actual es engañosa, ya que el segundo argumento es realmente una referencia a la clase Map (debería ser "jclass clazz" en lugar de "jobject thiz") . Realmente no importa, ya que no estás usando "thiz", y cada jclass es un jobject.

La manera de hacer esto no estático es eliminar la "estática" de la declaración en el lado de Java, y comenzar a usar "thiz" para acceder a los miembros de la instancia.

Podría ser un poco tarde, pero este libro de cocina aquí es invaluable!

http://thebreakfastpost.com/2012/01/23/wrapping-ac-library-with-jni-part-1/

A primera vista, y dependiendo de que necesite, SWIG podría ser meta-exceso de capacidad!

  • No se puede hacer JNI llamar desde c ++ a java en android lollipop usando jni
  • Detección de fugas de memoria nativas en el código JNI de Android
  • Android NDK: crea dos bibliotecas compartidas nativas que se llaman
  • Técnica subyacente de FaceDetector de Android
  • JNI manteniendo una referencia global a un objeto, accediendo a ella con otros métodos JNI. Mantener un objeto C ++ activo en varias llamadas JNI
  • ¿Cómo utilizar la biblioteca JNI compilada por NDK en una aplicación Java normal no Android?
  • Error de UnsatisfiedLink: Método nativo no encontrado findLibrary devuelto null
  • Actualización de la interfaz de usuario de hilo de fondo utilizando código nativo enteramente (sin JNI)?
  • Imprimir el seguimiento de la pila C en Android 5 / Lolipop
  • Acceda al objeto JNI a la capa de Java como puntero de referencia
  • Android JNI ¿Cuál es el directorio de trabajo actual para C / C ++ ejecutado código?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.