2012-04-12 10 views
14

के साथ एक फ़ंक्शन में aroid.content.Context पैरामीटर भेजना मैं एक ऐसी विधि बनाने की कोशिश कर रहा हूं जो इंटरनेट कनेक्शन के लिए जांच करता है जिसे कॉन्टेक्स्ट पैरामीटर की आवश्यकता होती है। जेएनआईहेल्पर मुझे पैरामीटर के साथ स्थिर कार्यों को कॉल करने की अनुमति देता है, लेकिन मुझे नहीं पता कि कोकोस 2 डी-एक्स गतिविधि वर्ग को पैरामीटर के रूप में उपयोग करने के लिए "पुनर्प्राप्त" कैसे करें।जेएनआई

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

आप मुझे बता सकते तुम क्यों इस संदर्भ की आवश्यकता है:

अपने अनुप्रयोग वर्ग और इसका इस्तेमाल प्राप्त करने के लिए के रूप में

, मैं निम्नलिखित कोड (सी ++ भाग में) का उपयोग करेंगे? बस सिस्टम सेवा प्राप्त करने के लिए ????? –

+1

यह समाधान नहीं है, लेकिन isNetworkAvailable के लिए वर्णनकर्ता गलत है। यह होना चाहिए: "(लैंड्रॉइड/सामग्री/संदर्भ;) जेड"। एल और जेड –

उत्तर

3

Cocos2dxActivity.java: Cocos2dxActivity को यह पंक्ति जोड़ें: अब

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

:

Cocos2dxActivity.context = getApplicationContext(); 

अपनी जगह डाल में: me = this;

उपयोग private static Activity me = null; onCreate से इस लाइन को निकालें आपको अपने जेनी से संदर्भ पारित करने की आवश्यकता नहीं है ... मुझे पता है कि यह सोल नहीं है ution लेकिन आपके मामले के लिए आपको जेनी से संदर्भ के बारे में चिंता करने की आवश्यकता नहीं है .. आप बस अपना काम कर सकते हैं।

उम्मीद है कि यह मदद करता है .. मैंने इस गेम का उपयोग अपने गेम में एंड्रॉइड से मेल भेजने के लिए किया था। :)

+0

स्टेटिक विशेषता शायद यहां सबसे अच्छा समाधान है, और यह जेनी कॉल के साथ भी पुनः प्राप्त करने योग्य है, इसलिए मैं इसे सही के रूप में दूंगा। –

+0

मुझे सलाह है कि आप कोड (कनेक्टिविटीमैनेजर) MyCocos2dxActivity.me.getSystemService ( Context.CONNECTIVITY_SERVICE) के साथ कोड संपादित करें; इसलिए यह दिखाता है कि यह काम कर सकता है भले ही नेटवर्क उपलब्ध है किसी अन्य वर्ग में है। –

1

पहले त्रुटि मैं देख रहा हूँ यह है कि आप विधि गलत तरीके से प्राप्त करने की कोशिश कर रहे हैं।

"(android/content/Context;)V" का अर्थ है कि आप एक विधि के लिए पूछ रहे हैं जो Context पैरामीटर के रूप में प्राप्त करता है और void देता है जो आपका मामला नहीं है।

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

मैं पूरी तरह से यकीन है कि चीजों को तोड़ने या यकीन है कि यह काम करेगा किया जा रहा बिना JNI करने के लिए एक Context पारित करने के लिए कैसे नहीं कर रहा हूँ:

आपका कॉल कुछ इस तरह होना चाहिए। लेकिन इसे पारित करने के बजाय, आप getApplication() पर कॉल कर सकते हैं और इसे Context के रूप में उपयोग कर सकते हैं।

+0

पर ध्यान दें भले ही मैं हस्ताक्षर और फ़ंक्शन कॉल बदलूं, समस्या बनी हुई है। ओपनफिंट को कॉल करने के लिए फ़ंक्शन क्या करता है, जो मुख्य गतिविधि की आवश्यकता होती है। मैं इसे जावा कोड में तय करता हूं, लेकिन मुझे यह जानना है कि अगर मुझे कहीं और चाहिए तो सीपीपी कोड से ऐप कैसे प्राप्त करें। –

+0

@EfEs: यह वह कोड नहीं है जिसे आप अपने प्रश्न में दिखा रहे हैं। मुझे यकीन नहीं है कि इसे कैसे किया जाए।जवाब देने के लिए मैं आपको http://groups.google.com/group/android-ndk में खोदने की सलाह दूंगा। – Macarse

2

आप निम्न विधि का उपयोग कर JNI के संदर्भ वस्तु पारित कर सकते हैं:

extern "C" { 
JNIEXPORT jboolean JNICALL 
Java_yournamespace_yourclassname_methodname(JNIEnv* env, jobject thiz, jobject p_context); 
} 
अपने जावा वर्ग पर

निम्नलिखित घोषणा का उपयोग करें:

public native static boolean methodname(Context p_context); 

अब आप से देशी समारोह कॉल कर सकते हैं अपने जावा कोड और एक संदर्भ एक पैरामीटर पास।

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

सही लेकिन गलत है। आपका कोड मेरी कॉल समस्याओं को ठीक करता है, लेकिन जो मैं चाहता हूं वह मुख्य अनुप्रयोग का वास्तविक गतिशील संदर्भ है, और इसके लिए मुझे इसे पहले से सी ++ कोड से पुनर्प्राप्त करने की आवश्यकता है। –

+0

गतिशील संदर्भ से आपका क्या मतलब है? मुख्य अनुप्रयोग संदर्भ को आपके जेएनआई कॉल के लिए getApplicationContext() – Muzikant

+0

का उपयोग करके एक तर्क के रूप में पारित किया जा सकता है और यह मेरा प्रश्न था, स्निपेट जो सीपीपी में करता है। –