15

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

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);
4

3 に答える 3

3

Cocos2dxActivity.java:この行をCocos2dxActivityに追加private static Activity me = null; します:onCreateからこの行を削除します:

Cocos2dxActivity.context = getApplicationContext();

その代わりに:me = this;

使用する :

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

これで、Jniからコンテキストを渡す必要はありません...これが解決策ではないことはわかっていますが、あなたの場合、Jniからのコンテキストについて心配する必要はありません。単純に作業を行うことができます。

これがお役に立てば幸いです。ゲームでAndroidからメールを送信するためにこの方法を使用しました。:)

于 2012-04-27T06:33:41.147 に答える
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コードからネイティブ関数を呼び出して、コンテキストにパラメーターを渡すことができます。

アプリクラスを取得して使用する場合は、次のコードを使用します(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);
于 2012-04-28T11:18:09.923 に答える
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

于 2012-04-24T13:24:29.157 に答える