blob: f72787f4239202faf2a75a8fc926d29277953020 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "flutter/shell/platform/android/android_choreographer.h"
#include "flutter/fml/native_library.h"
// Only avialalbe on API 24+
typedef void AChoreographer;
// Only available on API 29+ or API 24+ if the architecture is 64-bit.
typedef void (*AChoreographer_frameCallback)(int64_t frameTimeNanos,
void* data);
// Only avialalbe on API 24+
typedef AChoreographer* (*AChoreographer_getInstance_FPN)();
typedef void (*AChoreographer_postFrameCallback_FPN)(
AChoreographer* choreographer,
AChoreographer_frameCallback callback,
void* data);
static AChoreographer_getInstance_FPN AChoreographer_getInstance;
static AChoreographer_postFrameCallback_FPN AChoreographer_postFrameCallback;
namespace flutter {
bool AndroidChoreographer::ShouldUseNDKChoreographer() {
static std::optional<bool> use_ndk_choreographer;
if (use_ndk_choreographer) {
return use_ndk_choreographer.value();
}
auto libandroid = fml::NativeLibrary::Create("libandroid.so");
FML_DCHECK(libandroid);
auto get_instance_fn =
libandroid->ResolveFunction<AChoreographer_getInstance_FPN>(
"AChoreographer_getInstance");
auto post_frame_callback_fn =
libandroid->ResolveFunction<AChoreographer_postFrameCallback_FPN>(
"AChoreographer_postFrameCallback64");
#if FML_ARCH_CPU_64_BITS
if (!post_frame_callback_fn) {
post_frame_callback_fn =
libandroid->ResolveFunction<AChoreographer_postFrameCallback_FPN>(
"AChoreographer_postFrameCallback");
}
#endif
if (get_instance_fn && post_frame_callback_fn) {
AChoreographer_getInstance = get_instance_fn.value();
AChoreographer_postFrameCallback = post_frame_callback_fn.value();
use_ndk_choreographer = true;
} else {
use_ndk_choreographer = false;
}
return use_ndk_choreographer.value();
}
void AndroidChoreographer::PostFrameCallback(OnFrameCallback callback,
void* data) {
AChoreographer* choreographer = AChoreographer_getInstance();
AChoreographer_postFrameCallback(choreographer, callback, data);
}
} // namespace flutter