2012-04-12 31 views
14

Tôi đang cố gắng tạo phương thức kiểm tra kết nối internet cần tham số Ngữ cảnh. JNIHelper cho phép tôi gọi các hàm tĩnh với các tham số, nhưng tôi không biết cách "truy xuất" lớp Cocos2d-x Activity để sử dụng nó như một tham số.Gửi tham số android.content.Context tới một hàm với 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; 
} 

và C++ code đang

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

Bạn có thể cho tôi biết tại sao bạn cần bối cảnh này? Chỉ để có được getSystemService ????? –

+1

Đây không phải là giải pháp, nhưng bộ mô tả cho isNetworkAvailable là sai. Nó phải là: "(Landroid/content/Context;) Z". Lưu ý L và Z –

Trả lời

3

Cocos2dxActivity.java: Thêm dòng này để Cocos2dxActivity: private static Activity me = null; Hủy bỏ dòng này từ onCreate:

Cocos2dxActivity.context = getApplicationContext(); 

Ở vị trí đặt của nó: me = this;

sử dụng:

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

Bây giờ bạn không cần phải vượt qua bối cảnh từ Jni của bạn ... Tôi biết đây không phải là sol ution nhưng đối với trường hợp của bạn, bạn không cần phải lo lắng về bối cảnh từ Jni .. Bạn chỉ đơn giản là có thể làm công việc của bạn.

Hy vọng điều này sẽ giúp .. Tôi đã sử dụng cách này để gửi thư từ android trong trò chơi của mình. :)

+0

Thuộc tính tĩnh có lẽ là giải pháp tốt nhất ở đây và nó cũng có thể truy xuất được bằng các cuộc gọi jni nên tôi sẽ cung cấp cho nó chính xác. –

+0

Tôi khuyên bạn nên chỉnh sửa mã bằng (ConnectivityManager) MyCocos2dxActivity.me.getSystemService ( Context.CONNECTIVITY_SERVICE); vì vậy nó cho thấy nó có thể hoạt động ngay cả khi isNetworkAvailable nằm trong một lớp khác. –

1

Lỗi đầu tiên tôi nhìn thấy là bạn đang cố gắng để có được phương pháp này không chính xác.

"(android/content/Context;)V" có nghĩa là bạn đang yêu cầu một phương thức nhận Context làm thông số và trả về void không phải trường hợp của bạn.

cuộc gọi của bạn nên được một cái gì đó như thế này:

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

Tôi không hoàn toàn chắc chắn làm thế nào để vượt qua một Context-JNI mà không vi phạm những điều hay là chắc chắn nó sẽ làm việc. Nhưng thay vì chuyển nó, bạn có thể gọi getApplication() và sử dụng nó làm Context.

+0

Ngay cả khi tôi thay đổi chữ ký và chức năng gọi, vẫn còn vấn đề. Chức năng của hàm này là gọi OpenFeint, để thực hiện hoạt động chính. Tôi sắp xếp nó trong mã java, nhưng tôi muốn biết làm thế nào để có được các ứng dụng từ mã cpp trong trường hợp tôi cần nó ở một nơi khác. –

+0

@EfEs: Đó không phải là mã bạn đang hiển thị trong câu hỏi của bạn. Tôi không chắc chắn làm thế nào để làm điều đó sau đó.Tôi khuyên bạn nên tìm hiểu về http://groups.google.com/group/android-ndk để tìm hiểu câu trả lời. – Macarse

2

Bạn có thể vượt qua đối tượng Context để JNI bằng cách sử dụng phương pháp sau đây:

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

trên lớp java của bạn sử dụng khai báo như sau:

public native static boolean methodname(Context p_context); 

Bây giờ bạn có thể gọi hàm có nguồn gốc từ của bạn mã java và truyền một ngữ cảnh một tham số.

như để nhận lớp ứng dụng của bạn và sử dụng nó, tôi muốn sử dụng đoạn mã sau (trong C++ phần):

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

Đúng nhưng không chính xác. Mã của bạn sửa chữa các vấn đề cuộc gọi của tôi, nhưng những gì tôi muốn là bối cảnh động thực tế của ứng dụng chính, và cho rằng tôi cần phải lấy nó đầu tiên từ mã C++. –

+0

Bạn ngụ ý gì theo ngữ cảnh động? Ngữ cảnh ứng dụng chính có thể được chuyển như một đối số cho cuộc gọi JNI của bạn bằng cách sử dụng getApplicationContext() – Muzikant

+0

Và đó là câu hỏi của tôi, đoạn mã thực hiện điều đó, trong CPP. –

Các vấn đề liên quan