2012-04-12 24 views
14

我想创建一个方法来检查需要Context参数的Internet连接。 JNIHelper允许我使用参数调用静态函数,但我不知道如何“检索”Cocos2d-x Activity类以将其用作参数。发送一个android.content.Context参数给JNI函数

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

你能告诉我你为什么需要这方面?只是为了getSystemService ????? – 2012-04-24 09:54:09

+1

这不是解决方案,但isNetworkAvailable的描述符是错误的。它应该是:“(Landroid/content/Context;)Z”。请注意L和Z – 2012-04-27 21:37:36

回答

3

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

Cocos2dxActivity.context = getApplicationContext(); 

在其位放:me = this;

使用:

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

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

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

+0

静态属性可能是这里最好的解决方案,它也可以用jni调用检索,所以我会给它正确的。 – 2012-04-28 19:19:11

+0

我建议你使用(ConnectivityManager)MyCocos2dxActivity.me.getSystemService( Context.CONNECTIVITY_SERVICE)编辑代码;所以即使isNetworkAvailable在另一个类中,它也可以工作。 – 2012-04-28 19:24:12

1

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

"(android/content/Context;)V"表示您要求的方法接收Context作为参数并返回void,这不是您的情况。

您的电话应该是这样的:

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

我不完全知道如何传递一个ContextJNI没有摔东西或者是相信它会工作。但不是传递它,您可以拨打getApplication()并将其用作Context

+0

即使我更改签名和函数调用,问题仍然存在。该函数的功能是调用OpenFeint,它需要主Activity。我有点修复它的Java代码,但我想知道如何从cpp代码获取应用程序,以防我需要它在别的地方。 – 2012-04-24 13:31:30

+0

@EEs:这不是你在问题中显示的代码。那时我不知道该怎么做。我建议您深入http://groups.google.com/group/android-ndk以了解答案。 – Macarse 2012-04-24 13:40:59

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

现在你可以从调用本机的功能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); 
+0

正确但不正确。你的代码修复了我的调用问题,但我想要的是主应用程序的实际动态上下文,为此我需要先从C++代码中检索它。 – 2012-04-28 19:16:06

+0

动态上下文是什么意思?主应用程序上下文可以作为参数传递给使用getApplicationContext() – Muzikant 2012-04-29 17:54:00

+0

的JNI调用,这就是我的问题,即CPP中的代码片段。 – 2012-04-30 10:35:05

相关问题