2011-11-10 38 views
6

Tôi gọi NativeActivity từ JavaActivity. Điểm mấu chốt của NativeActivity của tôi làNativeActivity không hoàn thành

android_main(struct android_app* state) 

Vào cuối này, tôi gọi

ANativeActivity_finish 

Tuy nhiên hoạt động mẹ đẻ của tôi chỉ bị treo, thay vì trở về Hoạt động Java mà gọi nó (nó được gọi là chỉ cần sử dụng startActivity). Có vẻ như nó đang ở trạng thái tạm dừng. Cách duy nhất tôi có thể làm cho nó trở lại hoạt động trước đó là bằng cách gọi exit(0) vào cuối android_main của tôi, tuy nhiên điều này sẽ giết chết quá trình và gây ra các vấn đề khác.

Làm cách nào để thoát thành công NativeActivity của mình và quay lại JavaActivity được gọi là nó?

+0

Tôi tự hỏi tại sao câu hỏi này chưa được trả lời, là không có nhiều người cần phải gọi NativeActivity từ (Java) Activity, và trở về từ chúng? –

Trả lời

6

Tôi gặp sự cố tương tự. Về cơ bản nó làm việc cho tôi khi ANativeActivity_finish (..) được gọi trong vòng lặp chính, vì nó vô hiệu hóa các trạng thái và tự hoàn thành ứng dụng bằng cách thiết lập state-> destroyRequested thành 1 sau khi gọi ANativeActivity_finish (..) trong static void android_app_destroy (struct android_app * android_app) (android_native_app_glue.c C: 173).

void android_main(struct android_app* state) 
{ 
    // Attach current state if needed 
    state->activity->vm->AttachCurrentThread(&state->activity->env, NULL); 
    ... 
    // our main loop for the app. Will only return once the game is really finished. 
    while (true) { 
    ... 
    while ((ident=ALooper_pollAll(engine.animating ? 0 : -1, NULL, &events,(void**)&source)) >= 0) { 
     ... 
     // Check if we are exiting. Which is the case once we called ANativeActivity_finish(state->activity); 
     if (state->destroyRequested != 0) 
     { 
     // Quit our app stuff herehere 
     // detatch from current thread (if we have attached in the beginning) 
     state->activity->vm->DetachCurrentThread(); 
     // return the main, so we get back to our java activity which calle the nativeactivity 
     return; 
     } 
    } 
    if (engine.animating) 
    { 
     // animation stuff here 
    } 
    // if our app told us to finish 
    if(Closed) 
    { 
     ANativeActivity_finish(state->activity); 
    } 
    } 
} 

Vâng, đã quá muộn để bạn đoán, nhưng tôi đã dành rất nhiều thời gian cho nó bởi vì tôi không thể tìm thấy sultion nên tôi đăng nó ở đây cho tất cả những người gặp vấn đề tương tự. Thông tin thêm về các nội dung phức tạp khác liên quan đến việc tách và đính kèm cuộc gọi có thể tìm thấy tại đây: Access Android APK Asset data directly in c++ without Asset Manager and copying

+0

Tôi có thể hỏi tại thời điểm nào trong vòng đời của ứng dụng bạn đã đặt Đóng thành true? Tại APP_STATE gì? – Dev2rights

+0

Điều này xảy ra trong vòng lặp chính của động cơ của tôi. Bất cứ khi nào người dùng thoát trò chơi tức là khi nút quay lại được nhấn trong menu chính và người dùng chấp nhận lời nhắc đóng trò chơi. Điều này không xảy ra trong bất kỳ APP_STATE Android cụ thể nào. Nhưng trên thực tế, cuộc gọi Closed = true chỉ có thể xảy ra trong trạng thái "hoạt hình" vì tôi cập nhật hệ thống của mình ngay cả trong đó. nếu (engine.animating) {// hoạt ảnh ở đây} – odbb

2

Một giải pháp cuối cùng đã làm việc để hoàn thành (lớp con của) NativeActivity từ ứng dụng (bên gốc) đã gọi một phương thức java chạy finish() trên chuỗi giao diện người dùng.

C/C++ bên:

... 

jmethodID FinishHim = jni->GetMethodID(activityClass, "FinishMe", "()V"); 
jni->CallVoidMethod(state->activity->clazz, FinishHim); 

Java bên:

public class CustomNativeActivity extends NativeActivity { 

    ... 

    public void FinishMe() { 
     this.runOnUiThread(new Runnable() { 
      public void run() { 
       finish(); 
      } 
     }); 
    } 
} 
Các vấn đề liên quan