将android.content.Context参数发送到具有JNI的函数
我正在尝试创建一个方法来检查需要上下文参数的internet连接。JNIHelper允许我使用参数调用静态函数,但我不知道如何“检索”Cocos2d-x活动类以将其用作参数将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
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);