使用JNI将android.content.Context参数发送到函数

时间:2012-04-12 12:32:28

标签: android cocos2d-x java-native-interface

我正在尝试创建一个检查需要Context参数的Internet连接的方法。 JNIHelper允许我用参数调用静态函数,但我不知道如何“检索”Cocos2d-x Activity类以将其用作参数。

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

3 个答案:

答案 0 :(得分:3)

Cocos2dxActivity.java: 将此行添加到Cocos2dxActivity:private static Activity me = null; 从onCreate中删除此行:

Cocos2dxActivity.context = getApplicationContext();

取而代之的是:me = this;

使用:

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

现在你不需要从你的Jni传递上下文...我知道这不是解决方案,但对于你的情况你不需要担心来自Jni的上下文..你可以简单地完成你的工作。

希望这会有所帮助..我用这种方式在我的游戏中从android发送邮件。 :)

答案 1 :(得分:2)

您可以使用以下方法将Context对象传递给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);

现在,您可以从java代码中调用本机函数,并将参数传递给上下文。

关于获取app类并使用它,我将使用以下代码(在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);

答案 2 :(得分:1)

我看到的第一个错误是你试图让方法不正确。

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

,而不是传递它