summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSijie Chen <sijiec@google.com>2023-12-07 18:14:00 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-12-07 18:14:00 +0000
commit695ef5eb0598a8664b2c2efd95b165b5526abafb (patch)
tree77e48796f8c8e46a5b9b1b213136cc92eaacd16e
parentf9e3c97d45da2d700aa142ff19c1f5fcfad08036 (diff)
parent8cd1540b317a56a59b361c5adb6d8b267f4a8c5a (diff)
downloadnative_bridge_support-695ef5eb0598a8664b2c2efd95b165b5526abafb.tar.gz
[Berberis] Add libcamera2ndk library am: 8cd1540b31
Original change: https://android-review.googlesource.com/c/platform/frameworks/libs/native_bridge_support/+/2861225 Change-Id: Icc970ef4753785dd7dcf7a237f809c22c5d7e062 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--libcamera2ndk/Android.bp14
-rw-r--r--libcamera2ndk/proxy/android_camera_checks.h126
-rw-r--r--libcamera2ndk/proxy/android_camera_trampolines.cc446
-rw-r--r--libcamera2ndk/proxy/emulated_api_checker.cc17
-rw-r--r--libcamera2ndk/proxy/trampolines_arm64_to_x86_64-inl.h77
-rw-r--r--libcamera2ndk/proxy/trampolines_arm_to_x86-inl.h77
-rw-r--r--libcamera2ndk/proxy/trampolines_riscv64_to_x86_64-inl.h77
7 files changed, 834 insertions, 0 deletions
diff --git a/libcamera2ndk/Android.bp b/libcamera2ndk/Android.bp
index f114faf..d87707c 100644
--- a/libcamera2ndk/Android.bp
+++ b/libcamera2ndk/Android.bp
@@ -42,3 +42,17 @@ cc_library {
"libutils",
],
}
+
+filegroup {
+ name: "native_bridge_proxy_libcamera2ndk_files",
+ srcs: [
+ "proxy/android_camera_trampolines.cc",
+ ],
+}
+
+filegroup {
+ name: "native_bridge_proxy_libcamera2ndk_api_checker_files",
+ srcs: [
+ "proxy/emulated_api_checker.cc",
+ ],
+}
diff --git a/libcamera2ndk/proxy/android_camera_checks.h b/libcamera2ndk/proxy/android_camera_checks.h
new file mode 100644
index 0000000..fdf53e5
--- /dev/null
+++ b/libcamera2ndk/proxy/android_camera_checks.h
@@ -0,0 +1,126 @@
+/*
+* Copyright (C) 2023 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+// TODO(http://b/73019835) needed by NdkCameraCaptureSession.h
+#include <camera/NdkCaptureRequest.h>
+
+#include <camera/NdkCameraCaptureSession.h>
+#include <camera/NdkCameraError.h>
+#include <camera/NdkCameraManager.h>
+
+#include "berberis/base/struct_check.h"
+
+#if defined(__arm__) || defined(NATIVE_BRIDGE_GUEST_ARCH_ARM)
+
+// This is layout we expect from the ACameraManager_AvailabilityCallbacks
+// TODO: Note that we do not really have a way to test that guest structure layout is
+// the same (see http://b/78329188 for details)
+CHECK_STRUCT_LAYOUT(ACameraManager_AvailabilityCallbacks, 96, 32);
+CHECK_FIELD_LAYOUT(ACameraManager_AvailabilityCallbacks, context, 0, 32);
+CHECK_FIELD_LAYOUT(ACameraManager_AvailabilityCallbacks, onCameraAvailable, 32, 32);
+CHECK_FIELD_LAYOUT(ACameraManager_AvailabilityCallbacks, onCameraUnavailable, 64, 32);
+
+CHECK_STRUCT_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks, 320, 32);
+CHECK_FIELD_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks, availabilityCallbacks, 0, 96);
+CHECK_FIELD_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks,
+ onCameraAccessPrioritiesChanged,
+ 96,
+ 32);
+CHECK_FIELD_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks,
+ onPhysicalCameraAvailable,
+ 128,
+ 32);
+CHECK_FIELD_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks,
+ onPhysicalCameraUnavailable,
+ 160,
+ 32);
+CHECK_FIELD_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks, reserved, 192, 4 * 32);
+
+CHECK_STRUCT_LAYOUT(ACameraCaptureSession_captureCallbacks, 256, 32);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, context, 0, 32);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureStarted, 32, 32);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureProgressed, 64, 32);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureCompleted, 96, 32);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureFailed, 128, 32);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureSequenceCompleted, 160, 32);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureSequenceAborted, 192, 32);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureBufferLost, 224, 32);
+
+CHECK_STRUCT_LAYOUT(ACameraCaptureSession_stateCallbacks, 128, 32);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_stateCallbacks, context, 0, 32);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_stateCallbacks, onClosed, 32, 32);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_stateCallbacks, onReady, 64, 32);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_stateCallbacks, onActive, 96, 32);
+
+CHECK_STRUCT_LAYOUT(ACameraDevice_StateCallbacks, 96, 32);
+CHECK_FIELD_LAYOUT(ACameraDevice_StateCallbacks, context, 0, 32);
+CHECK_FIELD_LAYOUT(ACameraDevice_StateCallbacks, onDisconnected, 32, 32);
+CHECK_FIELD_LAYOUT(ACameraDevice_StateCallbacks, onError, 64, 32);
+
+#elif defined(__aarch64__) || defined(NATIVE_BRIDGE_GUEST_ARCH_ARM64) || defined(NATIVE_BRIDGE_GUEST_ARCH_RISCV64)
+
+// This is layout we expect from the ACameraManager_AvailabilityCallbacks
+// TODO: Note that we do not really have a way to test that guest structure layout is
+// the same (see http://b/78329188 for details)
+CHECK_STRUCT_LAYOUT(ACameraManager_AvailabilityCallbacks, 192, 64);
+CHECK_FIELD_LAYOUT(ACameraManager_AvailabilityCallbacks, context, 0, 64);
+CHECK_FIELD_LAYOUT(ACameraManager_AvailabilityCallbacks, onCameraAvailable, 64, 64);
+CHECK_FIELD_LAYOUT(ACameraManager_AvailabilityCallbacks, onCameraUnavailable, 128, 64);
+
+CHECK_STRUCT_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks, 640, 64);
+CHECK_FIELD_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks, availabilityCallbacks, 0, 192);
+CHECK_FIELD_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks,
+ onCameraAccessPrioritiesChanged,
+ 192,
+ 64);
+CHECK_FIELD_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks,
+ onPhysicalCameraAvailable,
+ 256,
+ 64);
+CHECK_FIELD_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks,
+ onPhysicalCameraUnavailable,
+ 320,
+ 64);
+CHECK_FIELD_LAYOUT(ACameraManager_ExtendedAvailabilityCallbacks, reserved, 384, 4 * 64);
+
+CHECK_STRUCT_LAYOUT(ACameraCaptureSession_captureCallbacks, 512, 64);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, context, 0, 64);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureStarted, 64, 64);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureProgressed, 128, 64);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureCompleted, 192, 64);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureFailed, 256, 64);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureSequenceCompleted, 320, 64);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureSequenceAborted, 384, 64);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_captureCallbacks, onCaptureBufferLost, 448, 64);
+
+CHECK_STRUCT_LAYOUT(ACameraCaptureSession_stateCallbacks, 256, 64);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_stateCallbacks, context, 0, 64);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_stateCallbacks, onClosed, 64, 64);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_stateCallbacks, onReady, 128, 64);
+CHECK_FIELD_LAYOUT(ACameraCaptureSession_stateCallbacks, onActive, 192, 64);
+
+CHECK_STRUCT_LAYOUT(ACameraDevice_StateCallbacks, 192, 64);
+CHECK_FIELD_LAYOUT(ACameraDevice_StateCallbacks, context, 0, 64);
+CHECK_FIELD_LAYOUT(ACameraDevice_StateCallbacks, onDisconnected, 64, 64);
+CHECK_FIELD_LAYOUT(ACameraDevice_StateCallbacks, onError, 128, 64);
+
+#else
+
+#error "Unknown guest/host arch combination"
+
+#endif
+
+CHECK_STRUCT_LAYOUT(camera_status_t, 32, 32);
diff --git a/libcamera2ndk/proxy/android_camera_trampolines.cc b/libcamera2ndk/proxy/android_camera_trampolines.cc
new file mode 100644
index 0000000..5749ed0
--- /dev/null
+++ b/libcamera2ndk/proxy/android_camera_trampolines.cc
@@ -0,0 +1,446 @@
+/*
+* Copyright (C) 2023 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+// TODO(http://b/73019835) needed by NdkCameraCaptureSession.h
+#include <camera/NdkCaptureRequest.h>
+
+#include <camera/NdkCameraCaptureSession.h>
+#include <camera/NdkCameraError.h>
+#include <camera/NdkCameraManager.h>
+
+#include "berberis/base/logging.h"
+#include "berberis/guest_abi/function_wrappers.h"
+#include "berberis/proxy_loader/proxy_library_builder.h"
+
+#include "android_camera_checks.h"
+
+namespace berberis {
+
+namespace {
+
+ACameraManager_AvailabilityCallbacks* ToHostACameraManager_AvailabilityCallbacks(
+ const ACameraManager_AvailabilityCallbacks* guest_callback,
+ ACameraManager_AvailabilityCallbacks* host_callback) {
+ if (guest_callback == nullptr) {
+ return nullptr;
+ }
+ *host_callback = {
+ guest_callback->context,
+ // typedef void (*ACameraManager_AvailabilityCallback)(void* context, const char* cameraId);
+ WrapGuestFunction(GuestType(guest_callback->onCameraAvailable), "onCameraAvailable-callback"),
+ WrapGuestFunction(GuestType(guest_callback->onCameraUnavailable),
+ "onCameraUnavailable-callback")};
+
+ return host_callback;
+}
+
+ACameraManager_ExtendedAvailabilityCallbacks* ToHostACameraManager_ExtendedAvailabilityCallbacks(
+ const ACameraManager_ExtendedAvailabilityCallbacks* guest_callback,
+ ACameraManager_ExtendedAvailabilityCallbacks* host_callback) {
+ if (guest_callback == nullptr) {
+ return nullptr;
+ }
+
+ auto* base_callbacks = ToHostACameraManager_AvailabilityCallbacks(
+ &(guest_callback->availabilityCallbacks), &(host_callback->availabilityCallbacks));
+ CHECK_EQ(base_callbacks, &(host_callback->availabilityCallbacks));
+
+ // typedef void (*ACameraManager_AccessPrioritiesChangedCallback)(void* context);
+ host_callback->onCameraAccessPrioritiesChanged =
+ WrapGuestFunction(GuestType(guest_callback->onCameraAccessPrioritiesChanged),
+ "onCameraAccessPrioritiesChanged-callback");
+
+ memset(&(host_callback->reserved), 0, sizeof(host_callback->reserved));
+
+ return host_callback;
+}
+
+ACameraCaptureSession_captureCallbacks* ToHostACameraCaptureSession_captureCallbacks(
+ const ACameraCaptureSession_captureCallbacks* guest_callbacks,
+ ACameraCaptureSession_captureCallbacks* host_callbacks) {
+ if (guest_callbacks == nullptr) {
+ return nullptr;
+ }
+
+ *host_callbacks = {
+ guest_callbacks->context,
+ // typedef void (*ACameraCaptureSession_captureCallback_start)(void* context,
+ // ACameraCaptureSession* session,
+ // const ACaptureRequest* request,
+ // int64_t timestamp);
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureStarted), "onCaptureStarted-callback"),
+ // typedef void (*ACameraCaptureSession_captureCallback_result)(void* context,
+ // ACameraCaptureSession*
+ // session, ACaptureRequest*
+ // request, const
+ // ACameraMetadata* result);
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureProgressed),
+ "onCaptureProgressed-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureCompleted),
+ "onCaptureCompleted-callback"),
+ // typedef void (*ACameraCaptureSession_captureCallback_failed)(void* context,
+ // ACameraCaptureSession*
+ // session, ACaptureRequest*
+ // request,
+ // ACameraCaptureFailure*
+ // failure);
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureFailed), "onCaptureFailed-callback"),
+ // typedef void (*ACameraCaptureSession_captureCallback_sequenceEnd)(
+ // void* context, ACameraCaptureSession* session, int sequenceId, int64_t frameNumber);
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureSequenceCompleted),
+ "onCaptureSequenceCompleted-callback"),
+ // typedef void (*ACameraCaptureSession_captureCallback_sequenceAbort)(
+ // void* context, ACameraCaptureSession* session, int sequenceId);
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureSequenceAborted),
+ "onCaptureSequenceAborted-callback"),
+ // typedef void (*ACameraCaptureSession_captureCallback_bufferLost)(
+ // void* context,
+ // ACameraCaptureSession* session,
+ // ACaptureRequest* request,
+ // ANativeWindow* window,
+ // int64_t frameNumber);
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureBufferLost),
+ "onCaptureBufferLost-callback"),
+
+ };
+
+ return host_callbacks;
+}
+
+ACameraCaptureSession_captureCallbacksV2* ToHostACameraCaptureSession_captureCallbacksV2(
+ const ACameraCaptureSession_captureCallbacksV2* guest_callbacks,
+ ACameraCaptureSession_captureCallbacksV2* host_callbacks) {
+ if (guest_callbacks == nullptr) {
+ return nullptr;
+ }
+
+ *host_callbacks = {
+ guest_callbacks->context,
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureStarted), "onCaptureStarted-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureProgressed),
+ "onCaptureProgressed-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureCompleted),
+ "onCaptureCompleted-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureFailed), "onCaptureFailed-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureSequenceCompleted),
+ "onCaptureSequenceCompleted-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureSequenceAborted),
+ "onCaptureSequenceAborted-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureBufferLost),
+ "onCaptureBufferLost-callback"),
+
+ };
+
+ return host_callbacks;
+}
+
+ACameraCaptureSession_logicalCamera_captureCallbacks*
+ToHostACameraCaptureSession_logicalCamera_captureCallbacks(
+ const ACameraCaptureSession_logicalCamera_captureCallbacks* guest_callbacks,
+ ACameraCaptureSession_logicalCamera_captureCallbacks* host_callbacks) {
+ if (guest_callbacks == nullptr) {
+ return nullptr;
+ }
+
+ *host_callbacks = {
+ guest_callbacks->context,
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureStarted), "onCaptureStarted-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureProgressed),
+ "onCaptureProgressed-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onLogicalCameraCaptureCompleted),
+ "onLogicalCameraCaptureCompleted-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onLogicalCameraCaptureFailed),
+ "onLogicalCameraCaptureFailed-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureSequenceCompleted),
+ "onCaptureSequenceCompleted-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureSequenceAborted),
+ "onCaptureSequenceAborted-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureBufferLost),
+ "onCaptureBufferLost-callback"),
+ };
+
+ return host_callbacks;
+}
+
+ACameraCaptureSession_logicalCamera_captureCallbacksV2*
+ToHostACameraCaptureSession_logicalCamera_captureCallbacksV2(
+ const ACameraCaptureSession_logicalCamera_captureCallbacksV2* guest_callbacks,
+ ACameraCaptureSession_logicalCamera_captureCallbacksV2* host_callbacks) {
+ if (guest_callbacks == nullptr) {
+ return nullptr;
+ }
+
+ *host_callbacks = {
+ guest_callbacks->context,
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureStarted), "onCaptureStarted-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureProgressed),
+ "onCaptureProgressed-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onLogicalCameraCaptureCompleted),
+ "onLogicalCameraCaptureCompleted-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onLogicalCameraCaptureFailed),
+ "onLogicalCameraCaptureFailed-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureSequenceCompleted),
+ "onCaptureSequenceCompleted-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureSequenceAborted),
+ "onCaptureSequenceAborted-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onCaptureBufferLost),
+ "onCaptureBufferLost-callback"),
+ };
+
+ return host_callbacks;
+}
+
+ACameraCaptureSession_stateCallbacks* ToHostACameraCaptureSession_stateCallbacks(
+ const ACameraCaptureSession_stateCallbacks* guest_callbacks,
+ ACameraCaptureSession_stateCallbacks* host_callbacks) {
+ if (guest_callbacks == nullptr) {
+ return nullptr;
+ }
+
+ *host_callbacks = {
+ guest_callbacks->context,
+ // typedef void (*ACameraCaptureSession_stateCallback)(void* context,
+ // ACameraCaptureSession* session);
+ WrapGuestFunction(GuestType(guest_callbacks->onClosed), "onClosed-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onReady), "onReady-callback"),
+ WrapGuestFunction(GuestType(guest_callbacks->onActive), "onActive-callback"),
+ };
+
+ return host_callbacks;
+}
+
+ACameraDevice_StateCallbacks* ToHostACameraDevice_StateCallbacks(
+ const ACameraDevice_StateCallbacks* guest_callbacks,
+ ACameraDevice_StateCallbacks* host_callbacks) {
+ if (guest_callbacks == nullptr) {
+ return nullptr;
+ }
+
+ *host_callbacks = {
+ guest_callbacks->context,
+ // typedef void (*ACameraDevice_StateCallback)(void* context, ACameraDevice* device);
+ WrapGuestFunction(GuestType(guest_callbacks->onDisconnected), "onDisconnected-callback"),
+ // typedef void (*ACameraDevice_ErrorStateCallback)(void* context,
+ // ACameraDevice* device,
+ // int error);
+ WrapGuestFunction(GuestType(guest_callbacks->onError), "onError-callback"),
+
+ };
+
+ return host_callbacks;
+}
+
+camera_status_t DoThunk_ACameraCaptureSession_capture(
+ ACameraCaptureSession* session,
+ ACameraCaptureSession_captureCallbacks* callbacks,
+ int numRequests,
+ ACaptureRequest** requests,
+ int* captureSequenceId) {
+ ACameraCaptureSession_captureCallbacks host_callbacks_holder;
+ auto host_callbacks =
+ ToHostACameraCaptureSession_captureCallbacks(callbacks, &host_callbacks_holder);
+ return ACameraCaptureSession_capture(
+ session, host_callbacks, numRequests, requests, captureSequenceId);
+}
+
+camera_status_t DoThunk_ACameraCaptureSession_captureV2(
+ ACameraCaptureSession* session,
+ ACameraCaptureSession_captureCallbacksV2* callbacks,
+ int numRequests,
+ ACaptureRequest** requests,
+ int* captureSequenceId) {
+ ACameraCaptureSession_captureCallbacksV2 host_callbacks_holder;
+ auto host_callbacks =
+ ToHostACameraCaptureSession_captureCallbacksV2(callbacks, &host_callbacks_holder);
+ return ACameraCaptureSession_captureV2(
+ session, host_callbacks, numRequests, requests, captureSequenceId);
+}
+
+camera_status_t DoThunk_ACameraCaptureSession_setRepeatingRequest(
+ ACameraCaptureSession* session,
+ ACameraCaptureSession_captureCallbacks* callbacks,
+ int numRequests,
+ ACaptureRequest** requests,
+ int* captureSequenceId) {
+ ACameraCaptureSession_captureCallbacks host_callbacks_holder;
+ auto host_callbacks =
+ ToHostACameraCaptureSession_captureCallbacks(callbacks, &host_callbacks_holder);
+ return ACameraCaptureSession_setRepeatingRequest(
+ session, host_callbacks, numRequests, requests, captureSequenceId);
+}
+
+camera_status_t DoThunk_ACameraCaptureSession_setRepeatingRequestV2(
+ ACameraCaptureSession* session,
+ ACameraCaptureSession_captureCallbacksV2* callbacks,
+ int numRequests,
+ ACaptureRequest** requests,
+ int* captureSequenceId) {
+ ACameraCaptureSession_captureCallbacksV2 host_callbacks_holder;
+ auto host_callbacks =
+ ToHostACameraCaptureSession_captureCallbacksV2(callbacks, &host_callbacks_holder);
+ return ACameraCaptureSession_setRepeatingRequestV2(
+ session, host_callbacks, numRequests, requests, captureSequenceId);
+}
+
+camera_status_t DoThunk_ACameraCaptureSession_logicalCamera_capture(
+ ACameraCaptureSession* session,
+ ACameraCaptureSession_logicalCamera_captureCallbacks* callbacks,
+ int numRequests,
+ ACaptureRequest** requests,
+ int* captureSequenceId) {
+ ACameraCaptureSession_logicalCamera_captureCallbacks host_callbacks_holder;
+ auto host_callbacks =
+ ToHostACameraCaptureSession_logicalCamera_captureCallbacks(callbacks, &host_callbacks_holder);
+ return ACameraCaptureSession_logicalCamera_capture(
+ session, host_callbacks, numRequests, requests, captureSequenceId);
+}
+
+camera_status_t DoThunk_ACameraCaptureSession_logicalCamera_captureV2(
+ ACameraCaptureSession* session,
+ ACameraCaptureSession_logicalCamera_captureCallbacksV2* callbacks,
+ int numRequests,
+ ACaptureRequest** requests,
+ int* captureSequenceId) {
+ ACameraCaptureSession_logicalCamera_captureCallbacksV2 host_callbacks_holder;
+ auto host_callbacks = ToHostACameraCaptureSession_logicalCamera_captureCallbacksV2(
+ callbacks, &host_callbacks_holder);
+ return ACameraCaptureSession_logicalCamera_captureV2(
+ session, host_callbacks, numRequests, requests, captureSequenceId);
+}
+
+camera_status_t DoThunk_ACameraCaptureSession_logicalCamera_setRepeatingRequest(
+ ACameraCaptureSession* session,
+ ACameraCaptureSession_logicalCamera_captureCallbacks* callbacks,
+ int numRequests,
+ ACaptureRequest** requests,
+ int* captureSequenceId) {
+ ACameraCaptureSession_logicalCamera_captureCallbacks host_callbacks_holder;
+ auto host_callbacks =
+ ToHostACameraCaptureSession_logicalCamera_captureCallbacks(callbacks, &host_callbacks_holder);
+ return ACameraCaptureSession_logicalCamera_setRepeatingRequest(
+ session, host_callbacks, numRequests, requests, captureSequenceId);
+}
+
+camera_status_t DoThunk_ACameraCaptureSession_logicalCamera_setRepeatingRequestV2(
+ ACameraCaptureSession* session,
+ ACameraCaptureSession_logicalCamera_captureCallbacksV2* callbacks,
+ int numRequests,
+ ACaptureRequest** requests,
+ int* captureSequenceId) {
+ ACameraCaptureSession_logicalCamera_captureCallbacksV2 host_callbacks_holder;
+ auto host_callbacks = ToHostACameraCaptureSession_logicalCamera_captureCallbacksV2(
+ callbacks, &host_callbacks_holder);
+ return ACameraCaptureSession_logicalCamera_setRepeatingRequestV2(
+ session, host_callbacks, numRequests, requests, captureSequenceId);
+}
+
+camera_status_t DoThunk_ACameraDevice_createCaptureSession(
+ ACameraDevice* device,
+ const ACaptureSessionOutputContainer* outputs,
+ const ACameraCaptureSession_stateCallbacks* callbacks,
+ ACameraCaptureSession** session) {
+ ACameraCaptureSession_stateCallbacks host_callbacks_holder;
+ auto host_callbacks =
+ ToHostACameraCaptureSession_stateCallbacks(callbacks, &host_callbacks_holder);
+ return ACameraDevice_createCaptureSession(device, outputs, host_callbacks, session);
+}
+
+camera_status_t DoThunk_ACameraDevice_createCaptureSessionWithSessionParameters(
+ ACameraDevice* device,
+ const ACaptureSessionOutputContainer* outputs,
+ const ACaptureRequest* sessionParameters,
+ const ACameraCaptureSession_stateCallbacks* callbacks,
+ ACameraCaptureSession** session) {
+ ACameraCaptureSession_stateCallbacks host_callbacks_holder;
+ auto host_callbacks =
+ ToHostACameraCaptureSession_stateCallbacks(callbacks, &host_callbacks_holder);
+ return ACameraDevice_createCaptureSessionWithSessionParameters(
+ device, outputs, sessionParameters, host_callbacks, session);
+}
+
+camera_status_t DoThunk_ACameraManager_openCamera(ACameraManager* manager,
+ const char* cameraId,
+ ACameraDevice_StateCallbacks* callbacks,
+ ACameraDevice** device) {
+ ACameraDevice_StateCallbacks host_callbacks_holder;
+ auto host_callbacks = ToHostACameraDevice_StateCallbacks(callbacks, &host_callbacks_holder);
+ return ACameraManager_openCamera(manager, cameraId, host_callbacks, device);
+}
+
+camera_status_t DoThunk_ACameraManager_registerAvailabilityCallback(
+ ACameraManager* opaque_manager,
+ const ACameraManager_AvailabilityCallbacks* guest_callback) {
+ ACameraManager_AvailabilityCallbacks host_callback_holder;
+ const auto host_callback =
+ ToHostACameraManager_AvailabilityCallbacks(guest_callback, &host_callback_holder);
+ return ACameraManager_registerAvailabilityCallback(opaque_manager, host_callback);
+}
+
+camera_status_t DoThunk_ACameraManager_unregisterAvailabilityCallback(
+ ACameraManager* opaque_manager,
+ const ACameraManager_AvailabilityCallbacks* guest_callback) {
+ // Note, if guest callbacks are the same as registered, we will find them
+ // in wrapper cache. If not, we'll wrap what we have and let host
+ // unregisterator decide how to interpret this invalid input (it currently
+ // ignores unregistered callbacks).
+ ACameraManager_AvailabilityCallbacks host_callback_holder;
+ const auto host_callback =
+ ToHostACameraManager_AvailabilityCallbacks(guest_callback, &host_callback_holder);
+ return ACameraManager_unregisterAvailabilityCallback(opaque_manager, host_callback);
+}
+
+camera_status_t DoThunk_ACameraManager_registerExtendedAvailabilityCallback(
+ ACameraManager* opaque_manager,
+ const ACameraManager_ExtendedAvailabilityCallbacks* guest_callback) {
+ ACameraManager_ExtendedAvailabilityCallbacks host_callback_holder;
+ const auto host_callback =
+ ToHostACameraManager_ExtendedAvailabilityCallbacks(guest_callback, &host_callback_holder);
+ return ACameraManager_registerExtendedAvailabilityCallback(opaque_manager, host_callback);
+}
+
+camera_status_t DoThunk_ACameraManager_unregisterExtendedAvailabilityCallback(
+ ACameraManager* opaque_manager,
+ const ACameraManager_ExtendedAvailabilityCallbacks* guest_callback) {
+ // See comment inside DoThunk_ACameraManager_unregisterAvailabilityCallback.
+ ACameraManager_ExtendedAvailabilityCallbacks host_callback_holder;
+ const auto host_callback =
+ ToHostACameraManager_ExtendedAvailabilityCallbacks(guest_callback, &host_callback_holder);
+ return ACameraManager_unregisterExtendedAvailabilityCallback(opaque_manager, host_callback);
+}
+
+#if defined(NATIVE_BRIDGE_GUEST_ARCH_ARM) && defined(__i386__)
+
+#include "trampolines_arm_to_x86-inl.h" // generated file NOLINT [build/include]
+
+#elif defined(NATIVE_BRIDGE_GUEST_ARCH_ARM64) && defined(__x86_64__)
+
+#include "trampolines_arm64_to_x86_64-inl.h" // generated file NOLINT [build/include]
+
+#elif defined(NATIVE_BRIDGE_GUEST_ARCH_RISCV64) && defined(__x86_64__)
+
+#include "trampolines_riscv64_to_x86_64-inl.h" // generated file NOLINT [build/include]
+
+#else
+
+#error "Unknown guest/host arch combination"
+
+#endif
+
+DEFINE_INIT_PROXY_LIBRARY("libcamera2ndk.so")
+
+} // namespace
+
+} // namespace berberis
diff --git a/libcamera2ndk/proxy/emulated_api_checker.cc b/libcamera2ndk/proxy/emulated_api_checker.cc
new file mode 100644
index 0000000..0dab59c
--- /dev/null
+++ b/libcamera2ndk/proxy/emulated_api_checker.cc
@@ -0,0 +1,17 @@
+/*
+* Copyright (C) 2023 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#include "android_camera_checks.h"
diff --git a/libcamera2ndk/proxy/trampolines_arm64_to_x86_64-inl.h b/libcamera2ndk/proxy/trampolines_arm64_to_x86_64-inl.h
new file mode 100644
index 0000000..fcf9a5c
--- /dev/null
+++ b/libcamera2ndk/proxy/trampolines_arm64_to_x86_64-inl.h
@@ -0,0 +1,77 @@
+// clang-format off
+const KnownTrampoline kKnownTrampolines[] = {
+{"ACameraCaptureSession_abortCaptures", GetTrampolineFunc<auto(void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraCaptureSession_capture", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_capture)},
+{"ACameraCaptureSession_captureV2", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_captureV2)},
+{"ACameraCaptureSession_close", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACameraCaptureSession_getDevice", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraCaptureSession_logicalCamera_capture", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_logicalCamera_capture)},
+{"ACameraCaptureSession_logicalCamera_captureV2", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_logicalCamera_captureV2)},
+{"ACameraCaptureSession_logicalCamera_setRepeatingRequest", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_logicalCamera_setRepeatingRequest)},
+{"ACameraCaptureSession_logicalCamera_setRepeatingRequestV2", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_logicalCamera_setRepeatingRequestV2)},
+{"ACameraCaptureSession_prepareWindow", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraCaptureSession_setRepeatingRequest", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_setRepeatingRequest)},
+{"ACameraCaptureSession_setRepeatingRequestV2", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_setRepeatingRequestV2)},
+{"ACameraCaptureSession_setWindowPreparedCallback", GetTrampolineFunc<auto(void*, void*, auto(*)(void*, void*, void*) -> void) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraCaptureSession_stopRepeating", GetTrampolineFunc<auto(void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraCaptureSession_updateSharedOutput", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraDevice_close", GetTrampolineFunc<auto(void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraDevice_createCaptureRequest", GetTrampolineFunc<auto(void*, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraDevice_createCaptureRequest_withPhysicalIds", GetTrampolineFunc<auto(void*, uint32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraDevice_createCaptureSession", GetTrampolineFunc<auto(void*, void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraDevice_createCaptureSession)},
+{"ACameraDevice_createCaptureSessionWithSessionParameters", GetTrampolineFunc<auto(void*, void*, void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraDevice_createCaptureSessionWithSessionParameters)},
+{"ACameraDevice_getId", GetTrampolineFunc<auto(void*) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"ACameraDevice_isSessionConfigurationSupported", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraManager_create", GetTrampolineFunc<auto(void) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"ACameraManager_delete", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACameraManager_deleteCameraIdList", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACameraManager_getCameraCharacteristics", GetTrampolineFunc<auto(void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraManager_getCameraIdList", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraManager_openCamera", GetTrampolineFunc<auto(void*, void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraManager_openCamera)},
+{"ACameraManager_registerAvailabilityCallback", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraManager_registerAvailabilityCallback)},
+{"ACameraManager_registerExtendedAvailabilityCallback", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraManager_registerExtendedAvailabilityCallback)},
+{"ACameraManager_unregisterAvailabilityCallback", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraManager_unregisterAvailabilityCallback)},
+{"ACameraManager_unregisterExtendedAvailabilityCallback", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraManager_unregisterExtendedAvailabilityCallback)},
+{"ACameraMetadata_copy", GetTrampolineFunc<auto(void*) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"ACameraMetadata_free", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACameraMetadata_fromCameraMetadata", GetTrampolineFunc<auto(void*, void*) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"ACameraMetadata_getAllTags", GetTrampolineFunc<auto(void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraMetadata_getConstEntry", GetTrampolineFunc<auto(void*, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraMetadata_isLogicalMultiCamera", GetTrampolineFunc<auto(void*, void*, void*) -> uint8_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraOutputTarget_create", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraOutputTarget_free", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_addTarget", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_copy", GetTrampolineFunc<auto(void*) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_free", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_getAllTags", GetTrampolineFunc<auto(void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_getConstEntry", GetTrampolineFunc<auto(void*, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_getConstEntry_physicalCamera", GetTrampolineFunc<auto(void*, void*, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_getUserContext", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_removeTarget", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_double", GetTrampolineFunc<auto(void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_float", GetTrampolineFunc<auto(void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_i32", GetTrampolineFunc<auto(void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_i64", GetTrampolineFunc<auto(void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_physicalCamera_double", GetTrampolineFunc<auto(void*, void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_physicalCamera_float", GetTrampolineFunc<auto(void*, void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_physicalCamera_i32", GetTrampolineFunc<auto(void*, void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_physicalCamera_i64", GetTrampolineFunc<auto(void*, void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_physicalCamera_rational", GetTrampolineFunc<auto(void*, void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_physicalCamera_u8", GetTrampolineFunc<auto(void*, void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_rational", GetTrampolineFunc<auto(void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_u8", GetTrampolineFunc<auto(void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setUserContext", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionOutputContainer_add", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionOutputContainer_create", GetTrampolineFunc<auto(void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionOutputContainer_free", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionOutputContainer_remove", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionOutput_create", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionOutput_free", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionPhysicalOutput_create", GetTrampolineFunc<auto(void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionSharedOutput_add", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionSharedOutput_create", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionSharedOutput_remove", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+}; // kKnownTrampolines
+const KnownVariable kKnownVariables[] = {
+}; // kKnownVariables
+// clang-format on
diff --git a/libcamera2ndk/proxy/trampolines_arm_to_x86-inl.h b/libcamera2ndk/proxy/trampolines_arm_to_x86-inl.h
new file mode 100644
index 0000000..fcf9a5c
--- /dev/null
+++ b/libcamera2ndk/proxy/trampolines_arm_to_x86-inl.h
@@ -0,0 +1,77 @@
+// clang-format off
+const KnownTrampoline kKnownTrampolines[] = {
+{"ACameraCaptureSession_abortCaptures", GetTrampolineFunc<auto(void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraCaptureSession_capture", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_capture)},
+{"ACameraCaptureSession_captureV2", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_captureV2)},
+{"ACameraCaptureSession_close", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACameraCaptureSession_getDevice", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraCaptureSession_logicalCamera_capture", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_logicalCamera_capture)},
+{"ACameraCaptureSession_logicalCamera_captureV2", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_logicalCamera_captureV2)},
+{"ACameraCaptureSession_logicalCamera_setRepeatingRequest", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_logicalCamera_setRepeatingRequest)},
+{"ACameraCaptureSession_logicalCamera_setRepeatingRequestV2", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_logicalCamera_setRepeatingRequestV2)},
+{"ACameraCaptureSession_prepareWindow", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraCaptureSession_setRepeatingRequest", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_setRepeatingRequest)},
+{"ACameraCaptureSession_setRepeatingRequestV2", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_setRepeatingRequestV2)},
+{"ACameraCaptureSession_setWindowPreparedCallback", GetTrampolineFunc<auto(void*, void*, auto(*)(void*, void*, void*) -> void) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraCaptureSession_stopRepeating", GetTrampolineFunc<auto(void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraCaptureSession_updateSharedOutput", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraDevice_close", GetTrampolineFunc<auto(void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraDevice_createCaptureRequest", GetTrampolineFunc<auto(void*, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraDevice_createCaptureRequest_withPhysicalIds", GetTrampolineFunc<auto(void*, uint32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraDevice_createCaptureSession", GetTrampolineFunc<auto(void*, void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraDevice_createCaptureSession)},
+{"ACameraDevice_createCaptureSessionWithSessionParameters", GetTrampolineFunc<auto(void*, void*, void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraDevice_createCaptureSessionWithSessionParameters)},
+{"ACameraDevice_getId", GetTrampolineFunc<auto(void*) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"ACameraDevice_isSessionConfigurationSupported", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraManager_create", GetTrampolineFunc<auto(void) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"ACameraManager_delete", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACameraManager_deleteCameraIdList", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACameraManager_getCameraCharacteristics", GetTrampolineFunc<auto(void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraManager_getCameraIdList", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraManager_openCamera", GetTrampolineFunc<auto(void*, void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraManager_openCamera)},
+{"ACameraManager_registerAvailabilityCallback", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraManager_registerAvailabilityCallback)},
+{"ACameraManager_registerExtendedAvailabilityCallback", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraManager_registerExtendedAvailabilityCallback)},
+{"ACameraManager_unregisterAvailabilityCallback", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraManager_unregisterAvailabilityCallback)},
+{"ACameraManager_unregisterExtendedAvailabilityCallback", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraManager_unregisterExtendedAvailabilityCallback)},
+{"ACameraMetadata_copy", GetTrampolineFunc<auto(void*) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"ACameraMetadata_free", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACameraMetadata_fromCameraMetadata", GetTrampolineFunc<auto(void*, void*) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"ACameraMetadata_getAllTags", GetTrampolineFunc<auto(void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraMetadata_getConstEntry", GetTrampolineFunc<auto(void*, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraMetadata_isLogicalMultiCamera", GetTrampolineFunc<auto(void*, void*, void*) -> uint8_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraOutputTarget_create", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraOutputTarget_free", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_addTarget", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_copy", GetTrampolineFunc<auto(void*) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_free", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_getAllTags", GetTrampolineFunc<auto(void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_getConstEntry", GetTrampolineFunc<auto(void*, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_getConstEntry_physicalCamera", GetTrampolineFunc<auto(void*, void*, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_getUserContext", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_removeTarget", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_double", GetTrampolineFunc<auto(void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_float", GetTrampolineFunc<auto(void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_i32", GetTrampolineFunc<auto(void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_i64", GetTrampolineFunc<auto(void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_physicalCamera_double", GetTrampolineFunc<auto(void*, void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_physicalCamera_float", GetTrampolineFunc<auto(void*, void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_physicalCamera_i32", GetTrampolineFunc<auto(void*, void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_physicalCamera_i64", GetTrampolineFunc<auto(void*, void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_physicalCamera_rational", GetTrampolineFunc<auto(void*, void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_physicalCamera_u8", GetTrampolineFunc<auto(void*, void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_rational", GetTrampolineFunc<auto(void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_u8", GetTrampolineFunc<auto(void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setUserContext", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionOutputContainer_add", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionOutputContainer_create", GetTrampolineFunc<auto(void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionOutputContainer_free", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionOutputContainer_remove", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionOutput_create", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionOutput_free", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionPhysicalOutput_create", GetTrampolineFunc<auto(void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionSharedOutput_add", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionSharedOutput_create", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionSharedOutput_remove", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+}; // kKnownTrampolines
+const KnownVariable kKnownVariables[] = {
+}; // kKnownVariables
+// clang-format on
diff --git a/libcamera2ndk/proxy/trampolines_riscv64_to_x86_64-inl.h b/libcamera2ndk/proxy/trampolines_riscv64_to_x86_64-inl.h
new file mode 100644
index 0000000..fcf9a5c
--- /dev/null
+++ b/libcamera2ndk/proxy/trampolines_riscv64_to_x86_64-inl.h
@@ -0,0 +1,77 @@
+// clang-format off
+const KnownTrampoline kKnownTrampolines[] = {
+{"ACameraCaptureSession_abortCaptures", GetTrampolineFunc<auto(void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraCaptureSession_capture", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_capture)},
+{"ACameraCaptureSession_captureV2", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_captureV2)},
+{"ACameraCaptureSession_close", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACameraCaptureSession_getDevice", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraCaptureSession_logicalCamera_capture", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_logicalCamera_capture)},
+{"ACameraCaptureSession_logicalCamera_captureV2", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_logicalCamera_captureV2)},
+{"ACameraCaptureSession_logicalCamera_setRepeatingRequest", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_logicalCamera_setRepeatingRequest)},
+{"ACameraCaptureSession_logicalCamera_setRepeatingRequestV2", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_logicalCamera_setRepeatingRequestV2)},
+{"ACameraCaptureSession_prepareWindow", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraCaptureSession_setRepeatingRequest", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_setRepeatingRequest)},
+{"ACameraCaptureSession_setRepeatingRequestV2", GetTrampolineFunc<auto(void*, void*, int32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraCaptureSession_setRepeatingRequestV2)},
+{"ACameraCaptureSession_setWindowPreparedCallback", GetTrampolineFunc<auto(void*, void*, auto(*)(void*, void*, void*) -> void) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraCaptureSession_stopRepeating", GetTrampolineFunc<auto(void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraCaptureSession_updateSharedOutput", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraDevice_close", GetTrampolineFunc<auto(void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraDevice_createCaptureRequest", GetTrampolineFunc<auto(void*, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraDevice_createCaptureRequest_withPhysicalIds", GetTrampolineFunc<auto(void*, uint32_t, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraDevice_createCaptureSession", GetTrampolineFunc<auto(void*, void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraDevice_createCaptureSession)},
+{"ACameraDevice_createCaptureSessionWithSessionParameters", GetTrampolineFunc<auto(void*, void*, void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraDevice_createCaptureSessionWithSessionParameters)},
+{"ACameraDevice_getId", GetTrampolineFunc<auto(void*) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"ACameraDevice_isSessionConfigurationSupported", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraManager_create", GetTrampolineFunc<auto(void) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"ACameraManager_delete", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACameraManager_deleteCameraIdList", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACameraManager_getCameraCharacteristics", GetTrampolineFunc<auto(void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraManager_getCameraIdList", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraManager_openCamera", GetTrampolineFunc<auto(void*, void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraManager_openCamera)},
+{"ACameraManager_registerAvailabilityCallback", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraManager_registerAvailabilityCallback)},
+{"ACameraManager_registerExtendedAvailabilityCallback", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraManager_registerExtendedAvailabilityCallback)},
+{"ACameraManager_unregisterAvailabilityCallback", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraManager_unregisterAvailabilityCallback)},
+{"ACameraManager_unregisterExtendedAvailabilityCallback", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(DoThunk_ACameraManager_unregisterExtendedAvailabilityCallback)},
+{"ACameraMetadata_copy", GetTrampolineFunc<auto(void*) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"ACameraMetadata_free", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACameraMetadata_fromCameraMetadata", GetTrampolineFunc<auto(void*, void*) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"ACameraMetadata_getAllTags", GetTrampolineFunc<auto(void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraMetadata_getConstEntry", GetTrampolineFunc<auto(void*, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraMetadata_isLogicalMultiCamera", GetTrampolineFunc<auto(void*, void*, void*) -> uint8_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraOutputTarget_create", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACameraOutputTarget_free", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_addTarget", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_copy", GetTrampolineFunc<auto(void*) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_free", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_getAllTags", GetTrampolineFunc<auto(void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_getConstEntry", GetTrampolineFunc<auto(void*, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_getConstEntry_physicalCamera", GetTrampolineFunc<auto(void*, void*, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_getUserContext", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_removeTarget", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_double", GetTrampolineFunc<auto(void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_float", GetTrampolineFunc<auto(void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_i32", GetTrampolineFunc<auto(void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_i64", GetTrampolineFunc<auto(void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_physicalCamera_double", GetTrampolineFunc<auto(void*, void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_physicalCamera_float", GetTrampolineFunc<auto(void*, void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_physicalCamera_i32", GetTrampolineFunc<auto(void*, void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_physicalCamera_i64", GetTrampolineFunc<auto(void*, void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_physicalCamera_rational", GetTrampolineFunc<auto(void*, void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_physicalCamera_u8", GetTrampolineFunc<auto(void*, void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_rational", GetTrampolineFunc<auto(void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setEntry_u8", GetTrampolineFunc<auto(void*, uint32_t, uint32_t, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureRequest_setUserContext", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionOutputContainer_add", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionOutputContainer_create", GetTrampolineFunc<auto(void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionOutputContainer_free", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionOutputContainer_remove", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionOutput_create", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionOutput_free", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionPhysicalOutput_create", GetTrampolineFunc<auto(void*, void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionSharedOutput_add", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionSharedOutput_create", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"ACaptureSessionSharedOutput_remove", GetTrampolineFunc<auto(void*, void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+}; // kKnownTrampolines
+const KnownVariable kKnownVariables[] = {
+}; // kKnownVariables
+// clang-format on