Отправка параметра 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;
}

и код С++

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

Ответы

Ответ 1

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

Cocos2dxActivity.context = getApplicationContext();

На своем месте поместите: me = this;

использовать:

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

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

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

Ответ 2

Вы можете передать объект контекста в 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-кода и передать контекст параметру.

как для получения вашего класса приложения и его использования, я бы использовал следующий код (в части С++):

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

Ответ 3

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

"(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.