Fix Chromium roll failures due to classpath format changes in jni_zero

This commit addresses an issue resulting from a change [1] in the
jni_zero project, where the format of classpath entries changed
(from using slashes 'org/webrtc/PeerConnectionFactory'
to dots 'org.webrtc.PeerConnectionFactory'). These changes led to
failures in the Chromium rolls in WebRTC, as the Class loader in JNI
was not designed to handle class names with dots.

This CL fixes this issue by changing webrtc::GetClass to convert class
paths to what JNI expects.

[1] https://chromium-review.googlesource.com/c/chromium/src/+/5234469

Bug: chromium:1377351
Change-Id: I2f243bb4ed04136f86510fcd5472e9bfc2d4ba85
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/337900
Reviewed-by: Jeremy Leconte <jleconte@google.com>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Jeremy Leconte <jleconte@google.com>
Cr-Commit-Position: refs/heads/main@{#41666}
This commit is contained in:
Byoungchan Lee 2024-02-05 15:36:58 +09:00 committed by WebRTC LUCI CQ
parent f6ae657b07
commit ff616269f8

View File

@ -69,12 +69,20 @@ void InitClassLoader(JNIEnv* env) {
g_class_loader = new ClassLoader(env);
}
ScopedJavaLocalRef<jclass> GetClass(JNIEnv* env, const char* name) {
// The class loader will be null in the JNI code called from the ClassLoader
// ctor when we are bootstrapping ourself.
return (g_class_loader == nullptr)
? ScopedJavaLocalRef<jclass>(env, env->FindClass(name))
: g_class_loader->FindClass(env, name);
ScopedJavaLocalRef<jclass> GetClass(JNIEnv* env, const char* c_name) {
if (g_class_loader != nullptr) {
// The class loader will be null in the JNI code called from the ClassLoader
// ctor when we are bootstrapping ourself.
return g_class_loader->FindClass(env, c_name);
}
// jni_zero generated code uses dots instead of slashes.
// Convert to use slashes since that's what JNI's FindClass expects.
// See
// https://cs.android.com/android/platform/superproject/main/+/main:art/runtime/jni/check_jni.cc;l=349;drc=0f62043c1670cd365aba1894ad8046cdfc1c905d
std::string name(c_name);
std::replace(name.begin(), name.end(), '.', '/');
return ScopedJavaLocalRef<jclass>(env, env->FindClass(name.c_str()));
}
} // namespace webrtc