¿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.
- Mejor opción para representar video para iOS y Android
- Javah Error android.app.Activity not found
- Android ndk jni Ninguna implementación encontrada error
- JNI cambiar C a C ++
- JNI, método booleano de llamada
- Llame a un método JNI estático para devolver una cadena de C ++
- Cómo mantener un objeto C ++ dentro del código Java? ¿Posible?
- ¿Cómo arreglar el archivo libgnustl_shared.so duplicado que en sdks de terceros?
- OpenCV en Android - Encabezados; No hay tal directorio de archivos
- Android NDK: ¿Cómo limpiar el código nativo después de reiniciar la actividad?
- JNI proguard obfuscation
- Tabla de referencia local de JNI de Android Expand
- ¿Cómo hacer una llamada correcta desde Android a una función no estática en Java? (Cocos2Dx en la mezcla)
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!
- ¿Cómo puedo forzar a los elementos dentro de un elemento de posición fija a responder a eventos javascript onclick en el navegador web de Android?
- Quiero que mi campo EditText cambie su color mientras le ingresa valores