JNI

2012-04-12 23 views
14

ile bir işleve android.content.Context parametresi gönderme Bir Bağlam parametresi gerektiren internet bağlantısını denetleyen bir yöntem oluşturmaya çalışıyorum. JNIHelper, parametrelerle statik işlevleri çağırmamı sağlar, ancak bir parametre olarak kullanmak için Cocos2d-x Activity sınıfını nasıl "geri alacağımı" bilmiyorum.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; 
} 

ve C++ kodu

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

söyler misin: Uygulamanız sınıf ve kullanmak almak için olduğu gibi

, ben (C++ parçası olarak) şu kodu kullanırsınız? Sadece getSystemService almak için ????? –

+1

Bu çözüm değil, isNetworkAvailable için tanımlayıcı yanlış. Olması gereken: "(Landroid/content/Context;) Z". L ve Z'yi not edin –

cevap

3

Cocos2dxActivity.java: Cocos2dxActivity bu satırı ekleyin: Şimdi

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

: me = this;

kullanım: yeri koymak olarak

Cocos2dxActivity.context = getApplicationContext(); 

: private static Activity me = null; onCreate bu çizgiyi kaldırın İçeriği Jni'nizden geçirmeniz gerekmiyor ... Biliyorum bu sol değil ama sizin durumunuz için Jni'den bağlam hakkında endişelenmenize gerek yok. Sadece işinizi yapabilirsin.

Bu yardımcı olur umarım .. Oyunda android üzerinden posta göndermek için bu yolu kullandım. :)

+0

Statik özellik muhtemelen burada en iyi çözümdür ve aynı zamanda jni çağrıları ile geri alınabilir, bu yüzden doğru olarak vereceğim. –

+0

Kodu (ConnectivityManager) MyCocos2dxActivity.me.getSystemService ( Context.CONNECTIVITY_SERVICE) ile değiştirmenizi öneririm; Bu nedenle isNetworkAvailable başka bir sınıfta olsa bile çalışabileceğini gösterir. –

1

görüyorum ilk hatadır yanlış yöntemini almaya çalışırken olmasıdır.

"(android/content/Context;)V", Context parametresini parametre olarak alan ve void değerini döndüren bir yöntem isteğinde bulunduğunuz anlamına gelir.

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

Bazı şeyleri kırarak ya da çalışacağından emin olmadan JNI bir Context geçmesine tam olarak emin değilim:

Çağrınız böyle bir şey olması gerekir. Ancak, iletmek yerine getApplication() numaralı telefonu arayabilir ve onu Context olarak kullanabilirsiniz.

+0

İmzayı ve işlev çağrısını değiştirsem bile sorun devam eder. Fonksiyonun amacı, ana faaliyeti gerektiren OpenFeint'i çağırmaktır. Ben onu java koduna sabitledim, fakat başka bir yere ihtiyacım olduğunda cpp kodundan uygulamanın nasıl alınacağını bilmek istiyorum. –

+0

@EfEs: Sorunuzda gösterdiğiniz kod bu değil. O zaman nasıl yapacağımı bilmiyorum.Cevabı öğrenmek için http://groups.google.com/group/android-ndk adresine girmenizi öneririz. – Macarse

2

Aşağıdaki yöntemi kullanarak JNI için Bağlam nesneyi geçirebilir: java sınıfı

extern "C" { 
JNIEXPORT jboolean JNICALL 
Java_yournamespace_yourclassname_methodname(JNIEnv* env, jobject thiz, jobject p_context); 
} 

aşağıdaki bildiriyi kullanın:

public native static boolean methodname(Context p_context); 

Artık aralarından yerli işlevini çağırabilirsiniz senin java kodu ve bir bağlamı bir parametre geçirin. Bu bağlamda gerek neden

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

Doğru ama yanlış. Kodunuz çağrılarımı düzeltir, ancak istediğim ana uygulamanın gerçek dinamik bağlamıdır ve bunun için öncelikle C++ kodundan onu almam gerekir. –

+0

Dinamik içerikten ne demek istiyorsunuz? Ana uygulama bağlamı, getApplicationContext() – Muzikant

+0

kullanarak JNI çağrınıza bir argüman olarak iletilebilir. Ve bu benim sorum, CPP'de bunu yapan snippet'tir. –