Revert "Remove jni_generator_helper.h from WebRTC"
This reverts commit b690d7eb3521c90ae78c0abf5e7454201855b953.
Reason for revert: Breaks downstream
Bug: b/325408567, b/319078685, b/351773023
Original change's description:
> Remove jni_generator_helper.h from WebRTC
>
> Bug: b/325408567, b/319078685, b/351773023
> Change-Id: I84c168b4ef8c6936e2644ad85edda8687c6c491a
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/401480
> Reviewed-by: Jeremy Leconte <jleconte@google.com>
> Reviewed-by: Harald Alvestrand <hta@webrtc.org>
> Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org>
> Cr-Commit-Position: refs/heads/main@{#45191}
Bug: b/325408567, b/319078685, b/351773023
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Change-Id: Ib7820a585f15940ea4d6ecb6075b80da85700e60
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/401580
Reviewed-by: Jeremy Leconte <jleconte@google.com>
Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org>
Owners-Override: Mirko Bonadei <mbonadei@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#45192}
diff --git a/examples/androidnativeapi/BUILD.gn b/examples/androidnativeapi/BUILD.gn
index 64cd43e..d0f9014 100644
--- a/examples/androidnativeapi/BUILD.gn
+++ b/examples/androidnativeapi/BUILD.gn
@@ -31,6 +31,7 @@
testonly = true
sources = [ "java/org/webrtc/examples/androidnativeapi/CallClient.java" ]
namespace = "webrtc_examples"
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
rtc_shared_library("examples_androidnativeapi_jni") {
diff --git a/examples/androidvoip/BUILD.gn b/examples/androidvoip/BUILD.gn
index be28f08..3f517b7 100644
--- a/examples/androidvoip/BUILD.gn
+++ b/examples/androidvoip/BUILD.gn
@@ -40,6 +40,7 @@
testonly = true
sources = [ "java/org/webrtc/examples/androidvoip/VoipClient.java" ]
namespace = "webrtc_examples"
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
rtc_shared_library("examples_androidvoip_jni") {
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index f3db81c..ae44285 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -1000,6 +1000,7 @@
"native_api/jni/class_loader.cc",
"native_api/jni/java_types.cc",
"native_api/jni/jvm.cc",
+ "src/jni/jni_generator_helper.h",
]
public = [
@@ -1361,16 +1362,19 @@
"java/util/ArrayList.class",
"java/lang/Enum.class",
]
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
generate_jni("generated_environment_jni") {
sources = [ "api/org/webrtc/Environment.java" ]
namespace = "webrtc::jni"
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
generate_jni("generated_metrics_jni") {
sources = [ "api/org/webrtc/Metrics.java" ]
namespace = "webrtc::jni"
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
# Generated JNI for public JNI targets, matching order of targets
@@ -1384,6 +1388,7 @@
"src/java/org/webrtc/JniCommon.java",
]
namespace = "webrtc::jni"
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
generate_jni("generated_video_jni") {
@@ -1413,11 +1418,13 @@
"src/java/org/webrtc/WrappedNativeI420Buffer.java",
]
namespace = "webrtc::jni"
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
generate_jni("generated_video_egl_jni") {
sources = [ "src/java/org/webrtc/EglBase10Impl.java" ]
namespace = "webrtc::jni"
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
generate_jni("generated_libvpx_vp8_jni") {
@@ -1427,6 +1434,7 @@
]
namespace = "webrtc::jni"
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
generate_jni("generated_libvpx_vp9_jni") {
@@ -1436,18 +1444,21 @@
]
namespace = "webrtc::jni"
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
generate_jni("generated_libaom_av1_encoder_jni") {
sources = [ "api/org/webrtc/LibaomAv1Encoder.java" ]
namespace = "webrtc::jni"
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
generate_jni("generated_dav1d_jni") {
sources = [ "api/org/webrtc/Dav1dDecoder.java" ]
namespace = "webrtc::jni"
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
generate_jni("generated_swcodecs_jni") {
@@ -1457,11 +1468,13 @@
]
namespace = "webrtc::jni"
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
generate_jni("generated_rtcerror_jni") {
sources = [ "src/java/org/webrtc/RtcError.java" ]
namespace = "webrtc::jni"
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
generate_jni("generated_peerconnection_jni") {
@@ -1498,11 +1511,13 @@
"api/org/webrtc/TurnCustomizer.java",
]
namespace = "webrtc::jni"
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
generate_jni("generated_java_audio_jni") {
sources = [ "api/org/webrtc/audio/JavaAudioDeviceModule.java" ]
namespace = "webrtc::jni"
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
generate_jni("generated_builtin_audio_codecs_jni") {
@@ -1511,6 +1526,7 @@
"api/org/webrtc/BuiltinAudioEncoderFactoryFactory.java",
]
namespace = "webrtc::jni"
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
# Generated JNI for native API targets
@@ -1522,17 +1538,20 @@
"src/java/org/webrtc/WebRtcClassLoader.java",
]
namespace = "webrtc::jni"
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
# Generated JNI for internal targets.
generate_jni("generated_logging_jni") {
sources = [ "src/java/org/webrtc/JNILogging.java" ]
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
generate_jni("generated_audio_device_module_base_jni") {
sources = [ "src/java/org/webrtc/audio/WebRtcAudioManager.java" ]
namespace = "webrtc::jni"
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
generate_jni("generated_java_audio_device_module_native_jni") {
@@ -1541,6 +1560,7 @@
"src/java/org/webrtc/audio/WebRtcAudioTrack.java",
]
namespace = "webrtc::jni"
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
}
@@ -1788,6 +1808,7 @@
"native_unittests/org/webrtc/PeerConnectionFactoryInitializationHelper.java",
]
namespace = "webrtc::jni"
+ jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
}
robolectric_binary("android_sdk_junit_tests") {
diff --git a/sdk/android/src/jni/OWNERS b/sdk/android/src/jni/OWNERS
index 5573734..6d01899 100644
--- a/sdk/android/src/jni/OWNERS
+++ b/sdk/android/src/jni/OWNERS
@@ -2,3 +2,6 @@
per-file androidmetrics.cc=xalep@webrtc.org
per-file androidvideotracksource.*=xalep@webrtc.org
per-file androidvideotracksource.cc=xalep@webrtc.org
+
+per-file jni_generator_helper.cc=file://infra/OWNERS
+per-file jni_generator_helper.h=file://infra/OWNERS
diff --git a/sdk/android/src/jni/jni_generator_helper.h b/sdk/android/src/jni/jni_generator_helper.h
new file mode 100644
index 0000000..8fc711b
--- /dev/null
+++ b/sdk/android/src/jni/jni_generator_helper.h
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2017 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+// Do not include this file directly. It's intended to be used only by the JNI
+// generation script. We are exporting types in strange namespaces in order to
+// be compatible with the generated code targeted for Chromium.
+
+#ifndef SDK_ANDROID_SRC_JNI_JNI_GENERATOR_HELPER_H_
+#define SDK_ANDROID_SRC_JNI_JNI_GENERATOR_HELPER_H_
+
+#include <jni.h>
+
+#include <atomic>
+#include <cstdint>
+#include <cstring>
+
+#include "third_party/jni_zero/jni_zero_internal.h"
+
+#define JNI_REGISTRATION_EXPORT __attribute__((visibility("default")))
+
+#if defined(WEBRTC_ARCH_X86)
+// Dalvik JIT generated code doesn't guarantee 16-byte stack alignment on
+// x86 - use force_align_arg_pointer to realign the stack at the JNI
+// boundary. crbug.com/655248
+#define JNI_GENERATOR_EXPORT \
+ __attribute__((force_align_arg_pointer)) extern "C" JNIEXPORT JNICALL
+#else
+#define JNI_GENERATOR_EXPORT extern "C" JNIEXPORT JNICALL
+#endif
+
+// Re-export helpers in the old jni_generator namespace.
+// TODO(b/319078685): Remove once all uses of the jni_generator has been
+// updated.
+namespace jni_generator {
+using jni_zero::internal::kJniStackMarkerValue;
+
+// TODO(b/319078685): Remove JniJavaCallContextUnchecked once all uses of the
+// jni_generator has been updated.
+struct JniJavaCallContextUnchecked {
+ inline JniJavaCallContextUnchecked() {
+// TODO(ssid): Implement for other architectures.
+#if defined(__arm__) || defined(__aarch64__)
+ // This assumes that this method does not increment the stack pointer.
+ asm volatile("mov %0, sp" : "=r"(sp));
+#else
+ sp = 0;
+#endif
+ }
+
+ // Force no inline to reduce code size.
+ template <jni_zero::MethodID::Type type>
+ void Init(JNIEnv* env,
+ jclass clazz,
+ const char* method_name,
+ const char* jni_signature,
+ std::atomic<jmethodID>* atomic_method_id) {
+ env1 = env;
+
+ // Make sure compiler doesn't optimize out the assignment.
+ memcpy(&marker, &kJniStackMarkerValue, sizeof(kJniStackMarkerValue));
+ // Gets PC of the calling function.
+ pc = reinterpret_cast<uintptr_t>(__builtin_return_address(0));
+
+ method_id = jni_zero::MethodID::LazyGet<type>(
+ env, clazz, method_name, jni_signature, atomic_method_id);
+ }
+
+ ~JniJavaCallContextUnchecked() {
+ // Reset so that spurious marker finds are avoided.
+ memset(&marker, 0, sizeof(marker));
+ }
+
+ uint64_t marker;
+ uintptr_t sp;
+ uintptr_t pc;
+
+ JNIEnv* env1;
+ jmethodID method_id;
+};
+
+// TODO(b/319078685): Remove JniJavaCallContextChecked once all uses of the
+// jni_generator has been updated.
+// Context about the JNI call with exception unchecked to be stored in stack.
+struct JniJavaCallContextChecked {
+ // Force no inline to reduce code size.
+ template <jni_zero::MethodID::Type type>
+ void Init(JNIEnv* env,
+ jclass clazz,
+ const char* method_name,
+ const char* jni_signature,
+ std::atomic<jmethodID>* atomic_method_id) {
+ base.Init<type>(env, clazz, method_name, jni_signature, atomic_method_id);
+ // Reset `pc` to correct caller.
+ base.pc = reinterpret_cast<uintptr_t>(__builtin_return_address(0));
+ }
+
+ ~JniJavaCallContextChecked() { jni_zero::CheckException(base.env1); }
+
+ JniJavaCallContextUnchecked base;
+};
+
+static_assert(sizeof(JniJavaCallContextChecked) ==
+ sizeof(JniJavaCallContextUnchecked),
+ "Stack unwinder cannot work with structs of different sizes.");
+
+} // namespace jni_generator
+
+#endif // SDK_ANDROID_SRC_JNI_JNI_GENERATOR_HELPER_H_