2012-04-12 15 views
14

Contextパラメータが必要なインターネット接続をチェックするメソッドを作成しようとしています。 JNIHelperを使用すると、パラメータを持つ静的関数を呼び出すことができますが、パラメータとして使用するためにCocos2d-xアクティビティクラスを「取得」する方法はわかりません。JNIを持つ関数にandroid.content.Contextパラメータを送信する

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を得るために????? –

+1

これは解決策ではありませんが、isNetworkAvailableの記述子が間違っています。それは "(Landroid/content/Context;)Z"でなければなりません。 LとZに注意してください –

答えて

3

Cocos2dxActivity.java: がCocos2dxActivityに次の行を追加します。今すぐ

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

me = this;

使用:その場所プットで

Cocos2dxActivity.context = getApplicationContext(); 

private static Activity me = null; はのonCreateからこの行を削除しますあなたはあなたのJniからの文脈を渡す必要はありません...私はこれがゾルではないことを知っていますutionあなたの場合は、Jniからの文脈について心配する必要はありません。あなたは単にあなたの仕事をすることができます。

私はゲームにアンドロイドからメールを送信するためにこの方法を使いました。今、あなたはあなたからのネイティブ関数を呼び出すことができます

public native static boolean methodname(Context p_context); 

:次の宣言を使用するJavaクラスに

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

::)

+0

ここでは、おそらく静的属性が最適な解決策であり、それもjni呼び出しで取り出すことができるので、正しいものとします。 –

+0

コードを(ConnectivityManager)MyCocos2dxActivity.me.getSystemService( Context.CONNECTIVITY_SERVICE)で編集することをお勧めします。 isNetworkAvailableが別のクラスにあっても動作することを示しています。 –

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

署名と関数呼び出しを変更しても、問題は残ります。どのような機能が主なアクティビティをrequieres OpenFeintを呼び出すことです。私は一種のJavaコードで修正しましたが、私はどこか他の場所に必要な場合に備えて、アプリケーションをcppコードから取得する方法を知りたいと思います。 –

+0

@EfEs:それはあなたの質問に表示されているコードではありません。私はそれをどうやって行うのか分からない。その答えを知るにはhttp://groups.google.com/group/android-ndkを掘り下げることをお勧めします。 – Macarse

2

次の方法を使用してJNIに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++コードから取得する必要があります。 –

+0

動的なコンテキストとはどういう意味ですか?主なアプリケーションコンテキストは、getApplicationContext()を使用してJNI呼び出しに引き渡すことができます。 – Muzikant

+0

これは私の質問です。CPPでそれを行うスニペットです。 –

関連する問題