Merge "Rename jniGetReferent to GetReferent and cache the method id it uses." am: fe892a0f52

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2152646

Change-Id: I2dfdec571499cb10db92afe52b23ef0f585a5b51
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Orion Hodson
2022-07-21 22:34:18 +00:00
committed by Automerger Merge Worker
8 changed files with 49 additions and 14 deletions

View File

@@ -50,6 +50,7 @@ cc_library_shared {
"android_util_XmlBlock.cpp", "android_util_XmlBlock.cpp",
"android_util_jar_StrictJarFile.cpp", "android_util_jar_StrictJarFile.cpp",
"com_android_internal_util_VirtualRefBasePtr.cpp", "com_android_internal_util_VirtualRefBasePtr.cpp",
"core_jni_helpers.cpp",
":deviceproductinfoconstants_aidl", ":deviceproductinfoconstants_aidl",
], ],

View File

@@ -348,7 +348,7 @@ private:
virtual int handleEvent(int fd, int events, void* data) { virtual int handleEvent(int fd, int events, void* data) {
JNIEnv* env = AndroidRuntime::getJNIEnv(); JNIEnv* env = AndroidRuntime::getJNIEnv();
sp<SensorEventQueue> q = reinterpret_cast<SensorEventQueue *>(data); sp<SensorEventQueue> q = reinterpret_cast<SensorEventQueue *>(data);
ScopedLocalRef<jobject> receiverObj(env, jniGetReferent(env, mReceiverWeakGlobal)); ScopedLocalRef<jobject> receiverObj(env, GetReferent(env, mReceiverWeakGlobal));
ssize_t n; ssize_t n;
ASensorEvent buffer[16]; ASensorEvent buffer[16];

View File

@@ -138,7 +138,7 @@ void NativeDisplayEventReceiver::dispatchVsync(nsecs_t timestamp, PhysicalDispla
uint32_t count, VsyncEventData vsyncEventData) { uint32_t count, VsyncEventData vsyncEventData) {
JNIEnv* env = AndroidRuntime::getJNIEnv(); JNIEnv* env = AndroidRuntime::getJNIEnv();
ScopedLocalRef<jobject> receiverObj(env, jniGetReferent(env, mReceiverWeakGlobal)); ScopedLocalRef<jobject> receiverObj(env, GetReferent(env, mReceiverWeakGlobal));
if (receiverObj.get()) { if (receiverObj.get()) {
ALOGV("receiver %p ~ Invoking vsync handler.", this); ALOGV("receiver %p ~ Invoking vsync handler.", this);
@@ -155,7 +155,7 @@ void NativeDisplayEventReceiver::dispatchHotplug(nsecs_t timestamp, PhysicalDisp
bool connected) { bool connected) {
JNIEnv* env = AndroidRuntime::getJNIEnv(); JNIEnv* env = AndroidRuntime::getJNIEnv();
ScopedLocalRef<jobject> receiverObj(env, jniGetReferent(env, mReceiverWeakGlobal)); ScopedLocalRef<jobject> receiverObj(env, GetReferent(env, mReceiverWeakGlobal));
if (receiverObj.get()) { if (receiverObj.get()) {
ALOGV("receiver %p ~ Invoking hotplug handler.", this); ALOGV("receiver %p ~ Invoking hotplug handler.", this);
env->CallVoidMethod(receiverObj.get(), gDisplayEventReceiverClassInfo.dispatchHotplug, env->CallVoidMethod(receiverObj.get(), gDisplayEventReceiverClassInfo.dispatchHotplug,
@@ -170,7 +170,7 @@ void NativeDisplayEventReceiver::dispatchModeChanged(nsecs_t timestamp, Physical
int32_t modeId, nsecs_t) { int32_t modeId, nsecs_t) {
JNIEnv* env = AndroidRuntime::getJNIEnv(); JNIEnv* env = AndroidRuntime::getJNIEnv();
ScopedLocalRef<jobject> receiverObj(env, jniGetReferent(env, mReceiverWeakGlobal)); ScopedLocalRef<jobject> receiverObj(env, GetReferent(env, mReceiverWeakGlobal));
if (receiverObj.get()) { if (receiverObj.get()) {
ALOGV("receiver %p ~ Invoking mode changed handler.", this); ALOGV("receiver %p ~ Invoking mode changed handler.", this);
env->CallVoidMethod(receiverObj.get(), gDisplayEventReceiverClassInfo.dispatchModeChanged, env->CallVoidMethod(receiverObj.get(), gDisplayEventReceiverClassInfo.dispatchModeChanged,
@@ -185,7 +185,7 @@ void NativeDisplayEventReceiver::dispatchFrameRateOverrides(
nsecs_t timestamp, PhysicalDisplayId displayId, std::vector<FrameRateOverride> overrides) { nsecs_t timestamp, PhysicalDisplayId displayId, std::vector<FrameRateOverride> overrides) {
JNIEnv* env = AndroidRuntime::getJNIEnv(); JNIEnv* env = AndroidRuntime::getJNIEnv();
ScopedLocalRef<jobject> receiverObj(env, jniGetReferent(env, mReceiverWeakGlobal)); ScopedLocalRef<jobject> receiverObj(env, GetReferent(env, mReceiverWeakGlobal));
if (receiverObj.get()) { if (receiverObj.get()) {
ALOGV("receiver %p ~ Invoking FrameRateOverride handler.", this); ALOGV("receiver %p ~ Invoking FrameRateOverride handler.", this);
const auto frameRateOverrideClass = const auto frameRateOverrideClass =

View File

@@ -329,7 +329,7 @@ status_t NativeInputEventReceiver::consumeEvents(JNIEnv* env,
if (!skipCallbacks && !mBatchedInputEventPending && mInputConsumer.hasPendingBatch()) { if (!skipCallbacks && !mBatchedInputEventPending && mInputConsumer.hasPendingBatch()) {
// There is a pending batch. Come back later. // There is a pending batch. Come back later.
if (!receiverObj.get()) { if (!receiverObj.get()) {
receiverObj.reset(jniGetReferent(env, mReceiverWeakGlobal)); receiverObj.reset(GetReferent(env, mReceiverWeakGlobal));
if (!receiverObj.get()) { if (!receiverObj.get()) {
ALOGW("channel '%s' ~ Receiver object was finalized " ALOGW("channel '%s' ~ Receiver object was finalized "
"without being disposed.", "without being disposed.",
@@ -358,7 +358,7 @@ status_t NativeInputEventReceiver::consumeEvents(JNIEnv* env,
if (!skipCallbacks) { if (!skipCallbacks) {
if (!receiverObj.get()) { if (!receiverObj.get()) {
receiverObj.reset(jniGetReferent(env, mReceiverWeakGlobal)); receiverObj.reset(GetReferent(env, mReceiverWeakGlobal));
if (!receiverObj.get()) { if (!receiverObj.get()) {
ALOGW("channel '%s' ~ Receiver object was finalized " ALOGW("channel '%s' ~ Receiver object was finalized "
"without being disposed.", getInputChannelName().c_str()); "without being disposed.", getInputChannelName().c_str());

View File

@@ -200,7 +200,7 @@ status_t NativeInputEventSender::processConsumerResponse(JNIEnv* env) {
ALOGD("channel '%s' ~ Receiving finished signals.", getInputChannelName().c_str()); ALOGD("channel '%s' ~ Receiving finished signals.", getInputChannelName().c_str());
} }
ScopedLocalRef<jobject> senderObj(env, jniGetReferent(env, mSenderWeakGlobal)); ScopedLocalRef<jobject> senderObj(env, GetReferent(env, mSenderWeakGlobal));
if (!senderObj.get()) { if (!senderObj.get()) {
ALOGW("channel '%s' ~ Sender object was finalized without being disposed.", ALOGW("channel '%s' ~ Sender object was finalized without being disposed.",
getInputChannelName().c_str()); getInputChannelName().c_str());

View File

@@ -136,7 +136,7 @@ void InputQueue::handleMessage(const Message& message) {
switch(message.what) { switch(message.what) {
case MSG_FINISH_INPUT: case MSG_FINISH_INPUT:
JNIEnv* env = AndroidRuntime::getJNIEnv(); JNIEnv* env = AndroidRuntime::getJNIEnv();
ScopedLocalRef<jobject> inputQueueObj(env, jniGetReferent(env, mInputQueueWeakGlobal)); ScopedLocalRef<jobject> inputQueueObj(env, GetReferent(env, mInputQueueWeakGlobal));
if (!inputQueueObj.get()) { if (!inputQueueObj.get()) {
ALOGW("InputQueue was finalized without being disposed"); ALOGW("InputQueue was finalized without being disposed");
return; return;

View File

@@ -0,0 +1,35 @@
/*
* Copyright (C) 2022 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 "core_jni_helpers.h"
namespace android {
namespace {
jmethodID gGetReferent = nullptr;
} // namespace
jobject GetReferent(JNIEnv* env, jobject ref) {
if (gGetReferent == nullptr) {
jclass clazz = FindClassOrDie(env, "java/lang/ref/Reference");
gGetReferent = GetMethodIDOrDie(env, clazz, "get", "()Ljava/lang/Object;");
}
return env->CallObjectMethod(ref, gGetReferent);
}
} // namespace android

View File

@@ -90,11 +90,10 @@ static inline int RegisterMethodsOrDie(JNIEnv* env, const char* className,
return res; return res;
} }
static inline jobject jniGetReferent(JNIEnv* env, jobject ref) { /**
jclass cls = FindClassOrDie(env, "java/lang/ref/Reference"); * Returns the result of invoking java.lang.ref.Reference.get() on a Reference object.
jmethodID get = GetMethodIDOrDie(env, cls, "get", "()Ljava/lang/Object;"); */
return env->CallObjectMethod(ref, get); jobject GetReferent(JNIEnv* env, jobject ref);
}
/** /**
* Read the specified field from jobject, and convert to std::string. * Read the specified field from jobject, and convert to std::string.