Merge "Rename jniGetReferent to GetReferent and cache the method id it uses."
This commit is contained in:
@@ -50,6 +50,7 @@ cc_library_shared {
|
||||
"android_util_XmlBlock.cpp",
|
||||
"android_util_jar_StrictJarFile.cpp",
|
||||
"com_android_internal_util_VirtualRefBasePtr.cpp",
|
||||
"core_jni_helpers.cpp",
|
||||
":deviceproductinfoconstants_aidl",
|
||||
],
|
||||
|
||||
|
||||
@@ -332,7 +332,7 @@ private:
|
||||
virtual int handleEvent(int fd, int events, void* data) {
|
||||
JNIEnv* env = AndroidRuntime::getJNIEnv();
|
||||
sp<SensorEventQueue> q = reinterpret_cast<SensorEventQueue *>(data);
|
||||
ScopedLocalRef<jobject> receiverObj(env, jniGetReferent(env, mReceiverWeakGlobal));
|
||||
ScopedLocalRef<jobject> receiverObj(env, GetReferent(env, mReceiverWeakGlobal));
|
||||
|
||||
ssize_t n;
|
||||
ASensorEvent buffer[16];
|
||||
|
||||
@@ -102,7 +102,7 @@ void NativeDisplayEventReceiver::dispatchVsync(nsecs_t timestamp, PhysicalDispla
|
||||
uint32_t count, VsyncEventData vsyncEventData) {
|
||||
JNIEnv* env = AndroidRuntime::getJNIEnv();
|
||||
|
||||
ScopedLocalRef<jobject> receiverObj(env, jniGetReferent(env, mReceiverWeakGlobal));
|
||||
ScopedLocalRef<jobject> receiverObj(env, GetReferent(env, mReceiverWeakGlobal));
|
||||
if (receiverObj.get()) {
|
||||
ALOGV("receiver %p ~ Invoking vsync handler.", this);
|
||||
env->CallVoidMethod(receiverObj.get(), gDisplayEventReceiverClassInfo.dispatchVsync,
|
||||
@@ -118,7 +118,7 @@ void NativeDisplayEventReceiver::dispatchHotplug(nsecs_t timestamp, PhysicalDisp
|
||||
bool connected) {
|
||||
JNIEnv* env = AndroidRuntime::getJNIEnv();
|
||||
|
||||
ScopedLocalRef<jobject> receiverObj(env, jniGetReferent(env, mReceiverWeakGlobal));
|
||||
ScopedLocalRef<jobject> receiverObj(env, GetReferent(env, mReceiverWeakGlobal));
|
||||
if (receiverObj.get()) {
|
||||
ALOGV("receiver %p ~ Invoking hotplug handler.", this);
|
||||
env->CallVoidMethod(receiverObj.get(), gDisplayEventReceiverClassInfo.dispatchHotplug,
|
||||
@@ -133,7 +133,7 @@ void NativeDisplayEventReceiver::dispatchModeChanged(nsecs_t timestamp, Physical
|
||||
int32_t modeId, nsecs_t) {
|
||||
JNIEnv* env = AndroidRuntime::getJNIEnv();
|
||||
|
||||
ScopedLocalRef<jobject> receiverObj(env, jniGetReferent(env, mReceiverWeakGlobal));
|
||||
ScopedLocalRef<jobject> receiverObj(env, GetReferent(env, mReceiverWeakGlobal));
|
||||
if (receiverObj.get()) {
|
||||
ALOGV("receiver %p ~ Invoking mode changed handler.", this);
|
||||
env->CallVoidMethod(receiverObj.get(), gDisplayEventReceiverClassInfo.dispatchModeChanged,
|
||||
@@ -148,7 +148,7 @@ void NativeDisplayEventReceiver::dispatchFrameRateOverrides(
|
||||
nsecs_t timestamp, PhysicalDisplayId displayId, std::vector<FrameRateOverride> overrides) {
|
||||
JNIEnv* env = AndroidRuntime::getJNIEnv();
|
||||
|
||||
ScopedLocalRef<jobject> receiverObj(env, jniGetReferent(env, mReceiverWeakGlobal));
|
||||
ScopedLocalRef<jobject> receiverObj(env, GetReferent(env, mReceiverWeakGlobal));
|
||||
if (receiverObj.get()) {
|
||||
ALOGV("receiver %p ~ Invoking FrameRateOverride handler.", this);
|
||||
const auto frameRateOverrideClass =
|
||||
|
||||
@@ -328,7 +328,7 @@ status_t NativeInputEventReceiver::consumeEvents(JNIEnv* env,
|
||||
if (!skipCallbacks && !mBatchedInputEventPending && mInputConsumer.hasPendingBatch()) {
|
||||
// There is a pending batch. Come back later.
|
||||
if (!receiverObj.get()) {
|
||||
receiverObj.reset(jniGetReferent(env, mReceiverWeakGlobal));
|
||||
receiverObj.reset(GetReferent(env, mReceiverWeakGlobal));
|
||||
if (!receiverObj.get()) {
|
||||
ALOGW("channel '%s' ~ Receiver object was finalized "
|
||||
"without being disposed.",
|
||||
@@ -357,7 +357,7 @@ status_t NativeInputEventReceiver::consumeEvents(JNIEnv* env,
|
||||
|
||||
if (!skipCallbacks) {
|
||||
if (!receiverObj.get()) {
|
||||
receiverObj.reset(jniGetReferent(env, mReceiverWeakGlobal));
|
||||
receiverObj.reset(GetReferent(env, mReceiverWeakGlobal));
|
||||
if (!receiverObj.get()) {
|
||||
ALOGW("channel '%s' ~ Receiver object was finalized "
|
||||
"without being disposed.", getInputChannelName().c_str());
|
||||
|
||||
@@ -202,7 +202,7 @@ status_t NativeInputEventSender::processConsumerResponse(JNIEnv* env) {
|
||||
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()) {
|
||||
ALOGW("channel '%s' ~ Sender object was finalized without being disposed.",
|
||||
getInputChannelName().c_str());
|
||||
|
||||
@@ -135,7 +135,7 @@ void InputQueue::handleMessage(const Message& message) {
|
||||
switch(message.what) {
|
||||
case MSG_FINISH_INPUT:
|
||||
JNIEnv* env = AndroidRuntime::getJNIEnv();
|
||||
ScopedLocalRef<jobject> inputQueueObj(env, jniGetReferent(env, mInputQueueWeakGlobal));
|
||||
ScopedLocalRef<jobject> inputQueueObj(env, GetReferent(env, mInputQueueWeakGlobal));
|
||||
if (!inputQueueObj.get()) {
|
||||
ALOGW("InputQueue was finalized without being disposed");
|
||||
return;
|
||||
|
||||
35
core/jni/core_jni_helpers.cpp
Normal file
35
core/jni/core_jni_helpers.cpp
Normal 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
|
||||
@@ -90,11 +90,10 @@ static inline int RegisterMethodsOrDie(JNIEnv* env, const char* className,
|
||||
return res;
|
||||
}
|
||||
|
||||
static inline jobject jniGetReferent(JNIEnv* env, jobject ref) {
|
||||
jclass cls = FindClassOrDie(env, "java/lang/ref/Reference");
|
||||
jmethodID get = GetMethodIDOrDie(env, cls, "get", "()Ljava/lang/Object;");
|
||||
return env->CallObjectMethod(ref, get);
|
||||
}
|
||||
/**
|
||||
* Returns the result of invoking java.lang.ref.Reference.get() on a Reference object.
|
||||
*/
|
||||
jobject GetReferent(JNIEnv* env, jobject ref);
|
||||
|
||||
/**
|
||||
* Read the specified field from jobject, and convert to std::string.
|
||||
|
||||
Reference in New Issue
Block a user