Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 未调用APP_CMD_WINDOW_RESIZED,但已调整本机窗口的大小_Android_Android Ndk_Native Activity - Fatal编程技术网

Android 未调用APP_CMD_WINDOW_RESIZED,但已调整本机窗口的大小

Android 未调用APP_CMD_WINDOW_RESIZED,但已调整本机窗口的大小,android,android-ndk,native-activity,Android,Android Ndk,Native Activity,我有一个本机应用程序,它被配置为不破坏设备方向更改时的活动 <activity android:name="android.app.NativeActivity" ... android:configChanges="orientation|screenSize" ... > 在命令处理程序中,我可以看到使用ANativeWindow\u getHeight函数更改了窗口大小 (我知道ANativeWindow\u getHeight函数不是在配置更

我有一个本机应用程序,它被配置为不破坏设备方向更改时的活动

<activity android:name="android.app.NativeActivity"
    ...
    android:configChanges="orientation|screenSize"
    ...
    >
在命令处理程序中,我可以看到使用
ANativeWindow\u getHeight
函数更改了窗口大小

(我知道
ANativeWindow\u getHeight
函数不是在配置更改处理程序中使用以获取窗口大小的最佳方法,我只需要检查窗口是否已调整大小。)

如果调整了本机窗口的大小,我想应该触发以下本机命令

/**
 * Command from main thread: the current ANativeWindow has been resized.
 * Please redraw with its new size.
 */
APP_CMD_WINDOW_RESIZED

为什么它被阻止了?

我自己找到了原因

android原生应用程序glue没有用于触发
app\u CMD\u WINDOW\u RESIZED
命令的代码。但只有它的定义

原因是,没有注册本机回调
onNativeWindowResized

void ANativeActivity_onCreate(ANativeActivity* activity, 
                             void* savedState, size_t savedStateSize) {
    LOGV("Creating: %p\n", activity);
    activity->callbacks->onDestroy = onDestroy;
    activity->callbacks->onStart = onStart;
    activity->callbacks->onResume = onResume;
    activity->callbacks->onSaveInstanceState = onSaveInstanceState;
    activity->callbacks->onPause = onPause;
    activity->callbacks->onStop = onStop;
    activity->callbacks->onConfigurationChanged = onConfigurationChanged;
    activity->callbacks->onLowMemory = onLowMemory;
    activity->callbacks->onWindowFocusChanged = onWindowFocusChanged;
    activity->callbacks->onNativeWindowCreated = onNativeWindowCreated;
    activity->callbacks->onNativeWindowDestroyed = onNativeWindowDestroyed;
    activity->callbacks->onInputQueueCreated = onInputQueueCreated;
    activity->callbacks->onInputQueueDestroyed = onInputQueueDestroyed;
    activity->instance = android_app_create(activity, savedState, savedStateSize); 
}
最后,它没有注册的原因是一个android错误


本机回调的文档是

我无法证明这一点,但我怀疑bug报告有点不准确,而且在应用程序启动时,surfaceChanged不会被多次调用。见:
void ANativeActivity_onCreate(ANativeActivity* activity, 
                             void* savedState, size_t savedStateSize) {
    LOGV("Creating: %p\n", activity);
    activity->callbacks->onDestroy = onDestroy;
    activity->callbacks->onStart = onStart;
    activity->callbacks->onResume = onResume;
    activity->callbacks->onSaveInstanceState = onSaveInstanceState;
    activity->callbacks->onPause = onPause;
    activity->callbacks->onStop = onStop;
    activity->callbacks->onConfigurationChanged = onConfigurationChanged;
    activity->callbacks->onLowMemory = onLowMemory;
    activity->callbacks->onWindowFocusChanged = onWindowFocusChanged;
    activity->callbacks->onNativeWindowCreated = onNativeWindowCreated;
    activity->callbacks->onNativeWindowDestroyed = onNativeWindowDestroyed;
    activity->callbacks->onInputQueueCreated = onInputQueueCreated;
    activity->callbacks->onInputQueueDestroyed = onInputQueueDestroyed;
    activity->instance = android_app_create(activity, savedState, savedStateSize); 
}