Отправка параметра android.content.Context для функции с JNI

Я пытаюсь создать метод, который проверяет подключение к Интернету, которому нужен параметр Context. JNIHelper позволяет мне вызвать статические функции с параметрами, но я не знаю, как «извлечь» класс активности Cocos2d-x, чтобы использовать его в качестве параметра.

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

И код c ++

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

Solutions Collecting From Web of "Отправка параметра android.content.Context для функции с JNI"

Cocos2dxActivity.java: добавьте эту строку в Cocos2dxActivity: private static Activity me = null; Удалите эту строку из onCreate:

 Cocos2dxActivity.context = getApplicationContext(); 

Вместо этого поставьте: me = this;

Использование:

 (ConnectivityManager) me.getSystemService( Context.CONNECTIVITY_SERVICE); 

Теперь вам не нужно передавать контекст из вашего Jni … Я знаю, что это не решение, но для вашего случая вам не нужно беспокоиться о контексте из Jni .. Вы можете просто выполнять свою работу.

Надеюсь, это поможет. Я использовал этот способ для отправки почты от android в моей игре. 🙂

Вы можете передать объект контекста в JNI, используя следующий метод:

 extern "C" { JNIEXPORT jboolean JNICALL Java_yournamespace_yourclassname_methodname( JNIEnv* env, jobject thiz, jobject p_context); } 

На вашем классе java используйте следующее объявление:

 public native static boolean methodname(Context p_context); 

Теперь вы можете вызвать функцию native из своего java-кода и передать контекст параметру.

Как для получения вашего класса приложения и его использования, я бы использовал следующий код (в части 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); 

Первая ошибка, которую я вижу, заключается в том, что вы пытаетесь получить метод неправильно.

"(android/content/Context;)V" означает, что вы запрашиваете метод, который получает Context в качестве параметра и возвращает void который не является вашим случаем.

Ваш звонок должен быть примерно таким:

 jclass aClass = env->FindClass("my/app/TestApp"); env->GetMethodID(aClass, "isNetworkAvailable", "(android/content/Context;)Z"); 

Я не совсем уверен, как передать Context JNI не нарушая его или не уверен, что он сработает. Но вместо того, чтобы передавать его, вы можете вызвать getApplication() и использовать его как Context .