我正在尝试创建一个检查需要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);
答案 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
。