2012-04-12 2 views
14

Context 매개 변수가 필요한 인터넷 연결을 확인하는 메서드를 만들려고합니다. JNIHelper를 사용하면 매개 변수가있는 정적 함수를 호출 할 수 있지만 Cocos2d-x Activity 클래스를 "검색하여"매개 변수로 사용하는 방법을 모르겠습니다.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

당신이 말해 줄 수 : 앱 클래스와 그것을 사용 가져 오는 등

, I합니다 (C++ 부분)에 다음 코드를 사용하는 거라고? 그냥 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의 컨텍스트에 대해 걱정할 필요가 없습니다. 단순히 작업을 수행 할 수 있습니다.

희망이 도움이 .. 내 게임에서 안드로이드에서 메일을 보내려면이 방법을 사용했습니다. :)

+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"); 

내가 물건을 파괴하거나 작동 확인없이 JNIContext을 전달하는 방법을 완전히 확실하지 않다 :

귀하의 호출은 다음과 같이해야한다. 그러나 전달하는 대신 getApplication()으로 전화하여 Context으로 사용할 수 있습니다.

+0

서명 및 함수 호출을 변경하더라도 문제가 남아 있습니다. 이 함수가하는 일은 OpenFeint를 호출하는 것입니다.이 함수는 주 Activity를 다시 시작합니다. Java 코드에서 일종의 고정 된 있지만 다른 곳에서 필요할 경우에 대비하여 cpp 코드에서 응용 프로그램을 얻는 방법을 알고 싶습니다. –

+0

@EfEs : 귀하의 질문에 표시되는 코드가 아닙니다. 나는 그때 그것을하는 방법을 모르겠다.답변을 얻으려면 http://groups.google.com/group/android-ndk를 방문하시기 바랍니다. – Macarse

2

다음과 같은 방법을 사용하여 JNI에 Context 객체를 전달할 수 있습니다 : 당신의 자바 클래스에

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

정확하지만 잘못되었습니다. 귀하의 코드는 내 전화 문제를 해결하지만, 내가 원했던 것은 메인 애플리케이션의 실제 동적 컨텍스트이며,이를 위해 C++ 코드에서 먼저 검색해야합니다. –

+0

동적 컨텍스트 란 무엇입니까? 주 응용 프로그램 컨텍스트는 getApplicationContext()를 사용하여 JNI 호출에 인수로 전달할 수 있습니다. – Muzikant

+0

그리고 CPP에서이를 수행하는 스 니펫이었습니다. –

관련 문제