Tôi có một câu hỏi liên quan đến việc tạo ra một SurfaceView và sau đó nhận được một ANativeWindow từ nó.SurfaceView và ANativeWindow
- Có thích hợp để làm
mSurfaceView = new SurfaceView(this);
trong:
onCreate()
onStart()
Lý do hỏi: như tôi hiểu nó SurfaceView sẽ bị phá hủy khi chúng ta mất tập trung (cái gì khác che đậy t toàn bộ màn hình) vì vậy chúng tôi sẽ cần phải tạo lại mỗi khi chúng tôi lấy tiêu điểm (onStart() được thực hiện). Hoặc SurfaceView vẫn không hoạt động và có thể tái sử dụng?
Tiếp tục, bây giờ tôi muốn tạo cửa sổ gốc từ bề mặt được đề cập ở trên (trong mã gốc). Là nó thích hợp để làm
ANativeWindow* newwindow = ANativeWindow_fromSurface(jniEnv, joSurface)
trong:onSurfaceCreated_native(..., jobject surface)
onSurfaceChanged_native(..., jobject surface)
Lý do hỏi: onSurfaceChanged dường như luôn được gọi sau khi onSurfaceCreated
vì vậy chúng tôi có một lựa chọn như khi nào tạo cửa sổ gốc. Một mặt, nó xuất hiện hợp lý để làm điều này trong onSurfaceCreated
, nhưng hai jobject surface
xuất hiện để được tham chiếu các đối tượng khác nhau! (Như đã kiểm tra bằng cách tạo ra một ref toàn cầu yếu bề mặt trong onSurfaceCreated và kiểm tra nó chống lại cả NULL và bề mặt trong onSurfaceChanged, xem mã bên dưới)
onSurfaceCreated_native(JNIEnv env, ... ,jobject surface) {
myWeakObjectGlobal = env->NewWeakGlobalRef(surface);
}
onSurfaceChanged_native(JNIEnv env, ... ,jobject surface) {
if (env->IsSameObject(surface, myWeakObjectGlobal)) {
LOGW("onSurfaceChanged_native: new surface is SAME as old surface");
} else {
LOGW("onSurfaceChanged_native: new surface is DIFFERENT as old surface");
}
if (env->IsSameObject(NULL, myWeakObjectGlobal)) {
LOGW(" furthermore, old surface is NULL");
} else {
LOGW(" furthermore, old surface is NOT null");
}
}
Do đó, nếu thực sự có hai đối tượng bề mặt riêng biệt được gửi vào onSurfaceCreated và onSurfaceChanged, thì chúng ta muốn sử dụng cái mới nhất và không treo vào một tham chiếu bề mặt cũ, và do đó làm ANativeWindow_from_Surface trong onSurfaceChanged.
Tôi thực sự đánh giá cao nếu ai đó có thể tỏa sáng một chút về vấn đề này đối với tôi.
Bạn đã bao giờ tìm ra điều này chưa? Tôi đang cố gắng chia sẻ một bề mặt giữa OpenGL và Java, ANativeWindow có vẻ là một trong những cách hợp lý duy nhất để thực hiện điều này – ephemer