summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-12-12 02:16:58 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-12-12 02:16:58 +0000
commite81522da241e4be2565f2d3ed4960d1738778cd2 (patch)
treee2db8a0f0ec4776d5f44eb5465a2724810ec7ad4
parent9d6d0a06169919518d67cbafe09da372d7107663 (diff)
parent3086e27c0cf0433447127bad037eabe76eb743f5 (diff)
downloadnative_bridge_support-android14-qpr2-s3-release.tar.gz
Change-Id: Ibe3af14eb0b7896198e124e8ea311e3ed020a40e
-rw-r--r--libjnigraphics/Android.bp7
-rw-r--r--libjnigraphics/proxy/libjnigraphics_trampolines.cc93
-rw-r--r--libjnigraphics/proxy/trampolines_arm64_to_x86_64-inl.h45
-rw-r--r--libjnigraphics/proxy/trampolines_arm_to_x86-inl.h45
-rw-r--r--libjnigraphics/proxy/trampolines_riscv64_to_x86_64-inl.h45
5 files changed, 235 insertions, 0 deletions
diff --git a/libjnigraphics/Android.bp b/libjnigraphics/Android.bp
index eb785a8..bf26c74 100644
--- a/libjnigraphics/Android.bp
+++ b/libjnigraphics/Android.bp
@@ -33,3 +33,10 @@ cc_library {
},
shared_libs: ["libnative_bridge_guest_libandroid_runtime"],
}
+
+filegroup {
+ name: "native_bridge_proxy_libjnigraphics_files",
+ srcs: [
+ "proxy/libjnigraphics_trampolines.cc",
+ ],
+}
diff --git a/libjnigraphics/proxy/libjnigraphics_trampolines.cc b/libjnigraphics/proxy/libjnigraphics_trampolines.cc
new file mode 100644
index 0000000..696618f
--- /dev/null
+++ b/libjnigraphics/proxy/libjnigraphics_trampolines.cc
@@ -0,0 +1,93 @@
+/*
+* 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 <dlfcn.h>
+#include <stdint.h>
+
+#include <android/imagedecoder.h>
+
+#include "berberis/base/bit_util.h"
+#include "berberis/guest_abi/function_wrappers.h"
+#include "berberis/proxy_loader/proxy_library_builder.h"
+
+namespace berberis {
+
+namespace {
+
+// int AImageDecoder_setCrop(AImageDecoder*, ARect)
+void DoCustomTrampoline_AImageDecoder_setCrop(HostCode /* callee */, ProcessState* state) {
+#if defined(NATIVE_BRIDGE_GUEST_ARCH_ARM)
+ // On arm, ARect is passed the same way as 4x int32_t.
+ auto [decoder, left, top, right, bottom] =
+ GuestParamsValues<int(AImageDecoder*, int32_t, int32_t, int32_t, int32_t)>(state);
+#elif defined(NATIVE_BRIDGE_GUEST_ARCH_ARM64) || defined(NATIVE_BRIDGE_GUEST_ARCH_RISCV64)
+ // ARect is passed the same way as 2x int64_t.
+ auto [decoder, left_and_top, right_and_bottom] =
+ GuestParamsValues<int(AImageDecoder*, int64_t, int64_t)>(state);
+ int32_t left = left_and_top;
+ int32_t top = left_and_top >> 32;
+ int32_t right = right_and_bottom;
+ int32_t bottom = right_and_bottom >> 32;
+#else
+#error "Unknown guest arch"
+#endif
+ ARect crop{left, top, right, bottom};
+ auto&& [ret] = GuestReturnReference<decltype(AImageDecoder_setCrop)>(state);
+ ret = AImageDecoder_setCrop(decoder, crop);
+}
+
+// ARect AImageDecoderFrameInfo_getFrameRect(const AImageDecoderFrameInfo* info)
+void DoCustomTrampoline_AImageDecoderFrameInfo_getFrameRect(HostCode /* callee */,
+ ProcessState* state) {
+#if defined(NATIVE_BRIDGE_GUEST_ARCH_ARM)
+ // ARect is returned by pointer which GuestArgumentInfo normally supports.
+ using FuncType = decltype(AImageDecoderFrameInfo_getFrameRect);
+ using ResType = ARect;
+#elif defined(NATIVE_BRIDGE_GUEST_ARCH_ARM64) || defined(NATIVE_BRIDGE_GUEST_ARCH_RISCV64)
+ // ARect is returned in two integer registers which is equivalent to returning __uint128_t.
+ using FuncType = __uint128_t(const AImageDecoderFrameInfo* info);
+ using ResType = __uint128_t;
+#else
+#error "Unknown guest arch"
+#endif
+ auto [info] = GuestParamsValues<FuncType>(state);
+ auto&& [ret] = GuestReturnReference<FuncType>(state);
+ ret = bit_cast<ResType>(AImageDecoderFrameInfo_getFrameRect(info));
+}
+
+#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("libjnigraphics.so")
+
+} // namespace
+
+} // namespace berberis
diff --git a/libjnigraphics/proxy/trampolines_arm64_to_x86_64-inl.h b/libjnigraphics/proxy/trampolines_arm64_to_x86_64-inl.h
new file mode 100644
index 0000000..e8e6f8e
--- /dev/null
+++ b/libjnigraphics/proxy/trampolines_arm64_to_x86_64-inl.h
@@ -0,0 +1,45 @@
+// clang-format off
+const KnownTrampoline kKnownTrampolines[] = {
+{"AImageDecoderFrameInfo_create", GetTrampolineFunc<auto(void) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderFrameInfo_delete", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderFrameInfo_getBlendOp", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderFrameInfo_getDisposeOp", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderFrameInfo_getDuration", GetTrampolineFunc<auto(void*) -> int64_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderFrameInfo_getFrameRect", DoCustomTrampoline_AImageDecoderFrameInfo_getFrameRect, reinterpret_cast<void*>(DoBadThunk)},
+{"AImageDecoderFrameInfo_hasAlphaWithinBounds", GetTrampolineFunc<auto(void*) -> uint8_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderHeaderInfo_getAlphaFlags", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderHeaderInfo_getAndroidBitmapFormat", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderHeaderInfo_getDataSpace", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderHeaderInfo_getHeight", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderHeaderInfo_getMimeType", GetTrampolineFunc<auto(void*) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderHeaderInfo_getWidth", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_advanceFrame", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_computeSampledSize", GetTrampolineFunc<auto(void*, int32_t, void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_createFromAAsset", GetTrampolineFunc<auto(void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_createFromBuffer", GetTrampolineFunc<auto(void*, uint64_t, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_createFromFd", GetTrampolineFunc<auto(int32_t, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_decodeImage", GetTrampolineFunc<auto(void*, void*, uint64_t, uint64_t) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_delete", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_getFrameInfo", GetTrampolineFunc<auto(void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_getHeaderInfo", GetTrampolineFunc<auto(void*) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_getMinimumStride", GetTrampolineFunc<auto(void*) -> uint64_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_getRepeatCount", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_isAnimated", GetTrampolineFunc<auto(void*) -> uint8_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_resultToString", GetTrampolineFunc<auto(int32_t) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_rewind", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_setAndroidBitmapFormat", GetTrampolineFunc<auto(void*, int32_t) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_setCrop", DoCustomTrampoline_AImageDecoder_setCrop, reinterpret_cast<void*>(DoBadThunk)},
+{"AImageDecoder_setDataSpace", GetTrampolineFunc<auto(void*, int32_t) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_setInternallyHandleDisposePrevious", GetTrampolineFunc<auto(void*, uint8_t) -> void>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_setTargetSize", GetTrampolineFunc<auto(void*, int32_t, int32_t) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_setUnpremultipliedRequired", GetTrampolineFunc<auto(void*, uint8_t) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AndroidBitmap_compress", GetTrampolineFunc<auto(void*, int32_t, void*, int32_t, int32_t, void*, auto(*)(void*, void*, uint64_t) -> uint8_t) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AndroidBitmap_getDataSpace", GetTrampolineFunc<auto(void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AndroidBitmap_getHardwareBuffer", GetTrampolineFunc<auto(void*, void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AndroidBitmap_getInfo", GetTrampolineFunc<auto(void*, void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AndroidBitmap_lockPixels", GetTrampolineFunc<auto(void*, void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AndroidBitmap_unlockPixels", GetTrampolineFunc<auto(void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+}; // kKnownTrampolines
+const KnownVariable kKnownVariables[] = {
+}; // kKnownVariables
+// clang-format on
diff --git a/libjnigraphics/proxy/trampolines_arm_to_x86-inl.h b/libjnigraphics/proxy/trampolines_arm_to_x86-inl.h
new file mode 100644
index 0000000..579399f
--- /dev/null
+++ b/libjnigraphics/proxy/trampolines_arm_to_x86-inl.h
@@ -0,0 +1,45 @@
+// clang-format off
+const KnownTrampoline kKnownTrampolines[] = {
+{"AImageDecoderFrameInfo_create", GetTrampolineFunc<auto(void) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderFrameInfo_delete", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderFrameInfo_getBlendOp", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderFrameInfo_getDisposeOp", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderFrameInfo_getDuration", GetTrampolineFunc<auto(void*) -> int64_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderFrameInfo_getFrameRect", DoCustomTrampoline_AImageDecoderFrameInfo_getFrameRect, reinterpret_cast<void*>(DoBadThunk)},
+{"AImageDecoderFrameInfo_hasAlphaWithinBounds", GetTrampolineFunc<auto(void*) -> uint8_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderHeaderInfo_getAlphaFlags", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderHeaderInfo_getAndroidBitmapFormat", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderHeaderInfo_getDataSpace", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderHeaderInfo_getHeight", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderHeaderInfo_getMimeType", GetTrampolineFunc<auto(void*) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderHeaderInfo_getWidth", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_advanceFrame", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_computeSampledSize", GetTrampolineFunc<auto(void*, int32_t, void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_createFromAAsset", GetTrampolineFunc<auto(void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_createFromBuffer", GetTrampolineFunc<auto(void*, uint32_t, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_createFromFd", GetTrampolineFunc<auto(int32_t, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_decodeImage", GetTrampolineFunc<auto(void*, void*, uint32_t, uint32_t) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_delete", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_getFrameInfo", GetTrampolineFunc<auto(void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_getHeaderInfo", GetTrampolineFunc<auto(void*) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_getMinimumStride", GetTrampolineFunc<auto(void*) -> uint32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_getRepeatCount", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_isAnimated", GetTrampolineFunc<auto(void*) -> uint8_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_resultToString", GetTrampolineFunc<auto(int32_t) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_rewind", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_setAndroidBitmapFormat", GetTrampolineFunc<auto(void*, int32_t) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_setCrop", DoCustomTrampoline_AImageDecoder_setCrop, reinterpret_cast<void*>(DoBadThunk)},
+{"AImageDecoder_setDataSpace", GetTrampolineFunc<auto(void*, int32_t) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_setInternallyHandleDisposePrevious", GetTrampolineFunc<auto(void*, uint8_t) -> void>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_setTargetSize", GetTrampolineFunc<auto(void*, int32_t, int32_t) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_setUnpremultipliedRequired", GetTrampolineFunc<auto(void*, uint8_t) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AndroidBitmap_compress", GetTrampolineFunc<auto(void*, int32_t, void*, int32_t, int32_t, void*, auto(*)(void*, void*, uint32_t) -> uint8_t) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AndroidBitmap_getDataSpace", GetTrampolineFunc<auto(void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AndroidBitmap_getHardwareBuffer", GetTrampolineFunc<auto(void*, void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AndroidBitmap_getInfo", GetTrampolineFunc<auto(void*, void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AndroidBitmap_lockPixels", GetTrampolineFunc<auto(void*, void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AndroidBitmap_unlockPixels", GetTrampolineFunc<auto(void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+}; // kKnownTrampolines
+const KnownVariable kKnownVariables[] = {
+}; // kKnownVariables
+// clang-format on
diff --git a/libjnigraphics/proxy/trampolines_riscv64_to_x86_64-inl.h b/libjnigraphics/proxy/trampolines_riscv64_to_x86_64-inl.h
new file mode 100644
index 0000000..e8e6f8e
--- /dev/null
+++ b/libjnigraphics/proxy/trampolines_riscv64_to_x86_64-inl.h
@@ -0,0 +1,45 @@
+// clang-format off
+const KnownTrampoline kKnownTrampolines[] = {
+{"AImageDecoderFrameInfo_create", GetTrampolineFunc<auto(void) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderFrameInfo_delete", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderFrameInfo_getBlendOp", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderFrameInfo_getDisposeOp", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderFrameInfo_getDuration", GetTrampolineFunc<auto(void*) -> int64_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderFrameInfo_getFrameRect", DoCustomTrampoline_AImageDecoderFrameInfo_getFrameRect, reinterpret_cast<void*>(DoBadThunk)},
+{"AImageDecoderFrameInfo_hasAlphaWithinBounds", GetTrampolineFunc<auto(void*) -> uint8_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderHeaderInfo_getAlphaFlags", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderHeaderInfo_getAndroidBitmapFormat", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderHeaderInfo_getDataSpace", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderHeaderInfo_getHeight", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderHeaderInfo_getMimeType", GetTrampolineFunc<auto(void*) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoderHeaderInfo_getWidth", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_advanceFrame", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_computeSampledSize", GetTrampolineFunc<auto(void*, int32_t, void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_createFromAAsset", GetTrampolineFunc<auto(void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_createFromBuffer", GetTrampolineFunc<auto(void*, uint64_t, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_createFromFd", GetTrampolineFunc<auto(int32_t, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_decodeImage", GetTrampolineFunc<auto(void*, void*, uint64_t, uint64_t) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_delete", GetTrampolineFunc<auto(void*) -> void>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_getFrameInfo", GetTrampolineFunc<auto(void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_getHeaderInfo", GetTrampolineFunc<auto(void*) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_getMinimumStride", GetTrampolineFunc<auto(void*) -> uint64_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_getRepeatCount", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_isAnimated", GetTrampolineFunc<auto(void*) -> uint8_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_resultToString", GetTrampolineFunc<auto(int32_t) -> void*>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_rewind", GetTrampolineFunc<auto(void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_setAndroidBitmapFormat", GetTrampolineFunc<auto(void*, int32_t) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_setCrop", DoCustomTrampoline_AImageDecoder_setCrop, reinterpret_cast<void*>(DoBadThunk)},
+{"AImageDecoder_setDataSpace", GetTrampolineFunc<auto(void*, int32_t) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_setInternallyHandleDisposePrevious", GetTrampolineFunc<auto(void*, uint8_t) -> void>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_setTargetSize", GetTrampolineFunc<auto(void*, int32_t, int32_t) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AImageDecoder_setUnpremultipliedRequired", GetTrampolineFunc<auto(void*, uint8_t) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AndroidBitmap_compress", GetTrampolineFunc<auto(void*, int32_t, void*, int32_t, int32_t, void*, auto(*)(void*, void*, uint64_t) -> uint8_t) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AndroidBitmap_getDataSpace", GetTrampolineFunc<auto(void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AndroidBitmap_getHardwareBuffer", GetTrampolineFunc<auto(void*, void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AndroidBitmap_getInfo", GetTrampolineFunc<auto(void*, void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AndroidBitmap_lockPixels", GetTrampolineFunc<auto(void*, void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+{"AndroidBitmap_unlockPixels", GetTrampolineFunc<auto(void*, void*) -> int32_t>(), reinterpret_cast<void*>(NULL)},
+}; // kKnownTrampolines
+const KnownVariable kKnownVariables[] = {
+}; // kKnownVariables
+// clang-format on