Enviar un parámetro android.content.Context a una función con JNI
Estoy tratando de crear un método que comprueba la conexión a Internet que necesita un parámetro de contexto. El JNIHelper me permite llamar a funciones estáticas con parámetros, pero no sé cómo "recuperar" Cocos2d-x clase de actividad para utilizarlo como un parámetro.
public static boolean isNetworkAvailable(Context context) { boolean haveConnectedWifi = false; boolean haveConnectedMobile = false; ConnectivityManager cm = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE); NetworkInfo[] netInfo = cm.getAllNetworkInfo(); for (NetworkInfo ni : netInfo) { if (ni.getTypeName().equalsIgnoreCase("WIFI")) if (ni.isConnected()) haveConnectedWifi = true; if (ni.getTypeName().equalsIgnoreCase("MOBILE")) if (ni.isConnected()) haveConnectedMobile = true; } return haveConnectedWifi || haveConnectedMobile; }
Y el código c ++ es
- Crear mapa de bits de la matriz de bytes, que se descomprime desde un archivo JPEG a través de libjpeg
- Java.lang.UnsatisfiedLinkError: No se pudo cargar eposprint: findLibrary returned null
- Llamar al miembro de la clase JAVA desde el código nativo C / C ++
- ¿Cómo arreglar el archivo libgnustl_shared.so duplicado que en sdks de terceros?
- No se pudo cargar la biblioteca libopencv_java.so
JniMethodInfo methodInfo; if ( !JniHelper::getStaticMethodInfo( methodInfo, "my/app/TestApp", "isNetworkAvailable", "(Landroid/content/Context;)Z")) { //error return; } CCLog( "Method found and loaded!"); methodInfo.env->CallStaticBooleanMethod( methodInfo.classID, methodInfo.methodID); methodInfo.env->DeleteLocalRef( methodInfo.classID);
- Android Java JNI y C Char array No se puede reconocer el valor
- OpenCV para Android: ejemplo simple para convertir la imagen a escala de grises
- ¿Qué parte de los dispositivos Android beneficia de las optimizaciones de Libjpeg-turbo?
- CLI en DalvikVM falla en JNI lib
- ¿Cómo especificar matriz de clase en el parámetro GetMethodID método de firma?
- Llame a un método JNI estático para devolver una cadena de C ++
- Error de JNI: desbordamiento de tabla de referencia local 512 entradas
- Cómo llamar a función Java desde c
Cocos2dxActivity.java: Añade esta línea a Cocos2dxActivity: private static Activity me = null;
Quite esta línea de onCreate:
Cocos2dxActivity.context = getApplicationContext();
En su lugar poner: me = this;
utilizar :
(ConnectivityManager) me.getSystemService( Context.CONNECTIVITY_SERVICE);
Ahora no necesitas pasar el contexto de tu Jni … Sé que esta no es la solución, pero para tu caso no tienes que preocuparte por el contexto de Jni .. Simplemente puedes hacer tu trabajo.
Espero que esto ayude .. Utilicé esta manera para enviar correo desde android en mi juego. 🙂
Puede pasar el objeto Contexto a JNI utilizando el siguiente método:
extern "C" { JNIEXPORT jboolean JNICALL Java_yournamespace_yourclassname_methodname( JNIEnv* env, jobject thiz, jobject p_context); }
En su clase java utilice la siguiente declaración:
public native static boolean methodname(Context p_context);
Ahora puede llamar a la función nativa de su código java y pasar un contexto a un parámetro.
Como para obtener su clase de aplicación y utilizarlo, yo usaría el siguiente código (en la parte de C ++):
jclass yourAppClass = env->FindClass("my/app/TestApp"); jmethodID someMethodId = env->GetStaticMethodID(yourAppClass , "methodName", "(Landroid/content/Context;)Z"); jboolean retval = env->CallStaticObjectMethod(yourAppClass , someMethodId , p_context);
El primer error que veo es que usted está intentando conseguir el método incorrectamente.
"(android/content/Context;)V"
significa que está solicitando un método que recibe Context
como parámetro y devuelve void
que no es su caso.
Su llamada debe ser algo como esto:
jclass aClass = env->FindClass("my/app/TestApp"); env->GetMethodID(aClass, "isNetworkAvailable", "(android/content/Context;)Z");
No estoy completamente seguro de cómo pasar un Context
a JNI
sin romper las cosas o estar seguro de que funcionará. Pero en lugar de pasarlo, puede llamar a getApplication()
y usarlo como un Context
.
- Consultar proveedor de contenido de calendario durante un mes, pero mostrar instancias por día
- Android – ¿Cómo carga eficientemente una gran cantidad de texto en un TextView?