Merge "Rename jniGetReferent to GetReferent and cache the method id it uses." am: fe892a0f52 am: f0ac357afb am: d0058603e0
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2152646 Change-Id: Ic7af16163a5937e58371c4b3365cfb52461f4467 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -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",
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|||||||
@@ -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];
|
||||||
|
|||||||
@@ -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 =
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
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;
|
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.
|
||||||
|
|||||||
Reference in New Issue
Block a user