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

 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); 

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 .

  • Defragment H264 NAL corriente (originalmente 1722 avb paquetes)
  • ¿Cómo acceder a recursos (como sonido, imágenes, etc) directamente desde código nativo usando Android-NDK?
  • Cuándo utilizar JNIEXPORT y JNICALL en Android NDK?
  • Rellenar los datos en un mapa de bits de Android tan pronto como sea posible desde C
  • Callback Listener en Unity - Cómo llamar al método de archivo de script desde UnityPlayerActivity en Android
  • JNA para android
  • Android LocalServerSocket
  • Cómo devolver una matriz de JNI a Java?
  • JNI CALL cambia el parámetro jclass o cómo obtener un jobject desde un parámetro jclass
  • Android Camera takePicture utiliza Previews small buffer
  • ¿Cómo maneja la superficie la recolección de basura después de ser parcelada en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.