Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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

  • Técnica subyacente de FaceDetector de Android
  • Cómo depurar código nativo en un proyecto de biblioteca de Android?
  • Dalvik está buscando el archivo .so con extensión '.0' - ¿por qué?
  • Construye la librería Android-openssl para la plataforma 2.1
  • JNI se bloquea al llamar a CallVoidMethod
  • UnsatisfiedLinkError Android
  • Android - javah no encuentra mi clase
  • No se encontró JNI_OnLoad saltando init> Apagado de la aplicación
  • 3 Solutions collect form web for “Enviar un parámetro android.content.Context a una función con JNI”

    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 .

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.