将android.content.Context参数发送到具有JNI的函数

将android.content.Context参数发送到具有JNI的函数,android,cocos2d-x,java-native-interface,Android,Cocos2d X,Java Native Interface,我正在尝试创建一个方法来检查需要上下文参数的internet连接。JNIHelper允许我使用参数调用静态函数,但我不知道如何“检索”Cocos2d-x活动类以将其用作参数 public static boolean isNetworkAvailable(Context context) { boolean haveConnectedWifi = false; boolean haveConnectedMobile = false; ConnectivityManager

我正在尝试创建一个方法来检查需要上下文参数的internet连接。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);

我看到的第一个错误是,您试图错误地获取该方法

“(android/content/Context;)V”
表示您正在请求一个方法,该方法接收
上下文
作为参数,并返回
无效
,这与您的情况不同

你的电话应该是这样的:

jclass aClass = env->FindClass("my/app/TestApp");
env->GetMethodID(aClass, "isNetworkAvailable", "(android/content/Context;)Z");
我不完全确定如何将
上下文
传递给
JNI
,而不破坏东西或确保它能工作。但是,您可以调用
getApplication()
并将其用作
上下文

Cocos2dxActivity.java,而不是传递它: 将此行添加到Cocos2dxActivity:
private static Activity me=null
从onCreate中删除此行:

Cocos2dxActivity.context = getApplicationContext();
取而代之的是:
me=this

使用:

现在您不需要从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);
现在,您可以从java代码中调用本机函数,并将上下文传递给参数

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++部分):


你能告诉我为什么你需要这个背景吗?只是为了获取getSystemService?????这不是解决方案,但isNetworkAvailable的描述符是错误的。它应该是:“(Landroid/content/Context;)Z”。注意L和ZEven如果我更改签名和函数调用,问题仍然存在。该函数所做的是调用OpenFeint,这需要主活动。我在java代码中修复了它,但我想知道如何从cpp代码中获取应用程序,以防我在其他地方需要它。@EfEs:这不是您在问题中显示的代码。我不知道该怎么做。我建议你深入了解答案。正确但不正确。您的代码修复了我的呼叫问题,但我想要的是主应用程序的实际动态上下文,为此,我需要首先从C++代码中检索它。可以使用getApplicationContext()将主应用程序上下文作为参数传递给JNI调用,这是我的问题,在CPP.Static属性中实现这一点的代码段可能是这里最好的解决方案,并且它也可以通过JNI调用进行检索,因此我将给出正确的答案。我建议您使用(ConnectionManager)编辑代码mycos2dxactivity.me.getSystemService(Context.CONNECTIVITY\u服务);因此,它表明,即使isNetworkAvailable在另一个类中,它也可以工作。
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);