From 789103b97a56f39926bf62fde2ff8ccabbda156d Mon Sep 17 00:00:00 2001 From: Bo Liu Date: Thu, 15 Sep 2022 16:24:31 -0400 Subject: [PATCH] NDK methods to get SurfaceControl/Transction from java Test: ASurfaceControlTest#testSurfaceControl_fromSurfaceControl and ASurfaceControlTest#testSurfaceTransaction_fromTransaction Change-Id: Ic15bfaae22b50f70c1c82c8945c09b749654a00f --- core/java/android/view/SurfaceControl.java | 1 + core/jni/android_view_SurfaceControl.cpp | 51 ++++++++++++++++--- .../android_view_SurfaceControl.h | 38 ++++++++++++++ native/android/libandroid.map.txt | 2 + native/android/surface_control.cpp | 14 +++++ 5 files changed, 99 insertions(+), 7 deletions(-) create mode 100644 core/jni/include/android_runtime/android_view_SurfaceControl.h diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index aef38eb2e2d2f..a0a1cb14f4dab 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -447,6 +447,7 @@ public final class SurfaceControl implements Parcelable { private String mName; /** + * Note: do not rename, this field is used by native code. * @hide */ public long mNativeObject; diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index e64b2615e1e27..2d68359eb9a69 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -263,8 +264,14 @@ static struct { static struct { jclass clazz; + jfieldID mNativeObject; +} gTransactionClassInfo; + +static struct { + jclass clazz; + jfieldID mNativeObject; jmethodID invokeReleaseCallback; -} gInvokeReleaseCallback; +} gSurfaceControlClassInfo; class JNamedColorSpace { public: @@ -720,10 +727,11 @@ static ReleaseBufferCallback genReleaseCallback(JNIEnv* env, jobject releaseCall if (fenceCopy) { fenceCopy->incStrong(0); } - globalCallbackRef->env()->CallStaticVoidMethod(gInvokeReleaseCallback.clazz, - gInvokeReleaseCallback.invokeReleaseCallback, - globalCallbackRef->object(), - reinterpret_cast(fenceCopy)); + globalCallbackRef->env() + ->CallStaticVoidMethod(gSurfaceControlClassInfo.clazz, + gSurfaceControlClassInfo.invokeReleaseCallback, + globalCallbackRef->object(), + reinterpret_cast(fenceCopy)); }; } @@ -2129,6 +2137,28 @@ static jobject nativeGetDefaultApplyToken(JNIEnv* env, jclass clazz) { // ---------------------------------------------------------------------------- +SurfaceControl* android_view_SurfaceControl_getNativeSurfaceControl(JNIEnv* env, + jobject surfaceControlObj) { + if (!!surfaceControlObj && + env->IsInstanceOf(surfaceControlObj, gSurfaceControlClassInfo.clazz)) { + return reinterpret_cast( + env->GetLongField(surfaceControlObj, gSurfaceControlClassInfo.mNativeObject)); + } else { + return nullptr; + } +} + +SurfaceComposerClient::Transaction* android_view_SurfaceTransaction_getNativeSurfaceTransaction( + JNIEnv* env, jobject surfaceTransactionObj) { + if (!!surfaceTransactionObj && + env->IsInstanceOf(surfaceTransactionObj, gTransactionClassInfo.clazz)) { + return reinterpret_cast( + env->GetLongField(surfaceTransactionObj, gTransactionClassInfo.mNativeObject)); + } else { + return nullptr; + } +} + static const JNINativeMethod sSurfaceControlMethods[] = { // clang-format off {"nativeCreate", "(Landroid/view/SurfaceSession;Ljava/lang/String;IIIIJLandroid/os/Parcel;)J", @@ -2594,11 +2624,18 @@ int register_android_view_SurfaceControl(JNIEnv* env) GetFieldIDOrDie(env, displayDecorationSupportClazz, "alphaInterpretation", "I"); jclass surfaceControlClazz = FindClassOrDie(env, "android/view/SurfaceControl"); - gInvokeReleaseCallback.clazz = MakeGlobalRefOrDie(env, surfaceControlClazz); - gInvokeReleaseCallback.invokeReleaseCallback = + gSurfaceControlClassInfo.clazz = MakeGlobalRefOrDie(env, surfaceControlClazz); + gSurfaceControlClassInfo.mNativeObject = + GetFieldIDOrDie(env, gSurfaceControlClassInfo.clazz, "mNativeObject", "J"); + gSurfaceControlClassInfo.invokeReleaseCallback = GetStaticMethodIDOrDie(env, surfaceControlClazz, "invokeReleaseCallback", "(Ljava/util/function/Consumer;J)V"); + jclass surfaceTransactionClazz = FindClassOrDie(env, "android/view/SurfaceControl$Transaction"); + gTransactionClassInfo.clazz = MakeGlobalRefOrDie(env, surfaceTransactionClazz); + gTransactionClassInfo.mNativeObject = + GetFieldIDOrDie(env, gTransactionClassInfo.clazz, "mNativeObject", "J"); + return err; } diff --git a/core/jni/include/android_runtime/android_view_SurfaceControl.h b/core/jni/include/android_runtime/android_view_SurfaceControl.h new file mode 100644 index 0000000000000..10a7549032083 --- /dev/null +++ b/core/jni/include/android_runtime/android_view_SurfaceControl.h @@ -0,0 +1,38 @@ +/* + * Copyright 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. + */ + +#ifndef _ANDROID_VIEW_SURFACECONTROL_H +#define _ANDROID_VIEW_SURFACECONTROL_H + +#include +#include + +#include "jni.h" + +namespace android { + +/* Gets the underlying native SurfaceControl for a java SurfaceControl. */ +extern SurfaceControl* android_view_SurfaceControl_getNativeSurfaceControl( + JNIEnv* env, jobject surfaceControlObj); + +/* Gets the underlying native SurfaceControl for a java SurfaceControl. */ +extern SurfaceComposerClient::Transaction* +android_view_SurfaceTransaction_getNativeSurfaceTransaction(JNIEnv* env, + jobject surfaceTransactionObj); + +} // namespace android + +#endif // _ANDROID_VIEW_SURFACECONTROL_H diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt index 1f96617a1ede4..cb0f22f974ad9 100644 --- a/native/android/libandroid.map.txt +++ b/native/android/libandroid.map.txt @@ -238,6 +238,7 @@ LIBANDROID { ASurfaceControl_createFromWindow; # introduced=29 ASurfaceControl_acquire; # introduced=31 ASurfaceControl_release; # introduced=29 + ASurfaceControl_fromSurfaceControl; # introduced=34 ASurfaceTexture_acquireANativeWindow; # introduced=28 ASurfaceTexture_attachToGLContext; # introduced=28 ASurfaceTexture_detachFromGLContext; # introduced=28 @@ -255,6 +256,7 @@ LIBANDROID { ASurfaceTransaction_apply; # introduced=29 ASurfaceTransaction_create; # introduced=29 ASurfaceTransaction_delete; # introduced=29 + ASurfaceTransaction_fromTransaction; # introduced=34 ASurfaceTransaction_reparent; # introduced=29 ASurfaceTransaction_setBuffer; # introduced=29 ASurfaceTransaction_setBufferAlpha; # introduced=29 diff --git a/native/android/surface_control.cpp b/native/android/surface_control.cpp index 42f4406ce5e8b..9e4d726715027 100644 --- a/native/android/surface_control.cpp +++ b/native/android/surface_control.cpp @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include #include #include @@ -28,6 +30,8 @@ #include #include +#include + using namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; using namespace android; @@ -134,6 +138,11 @@ void ASurfaceControl_release(ASurfaceControl* aSurfaceControl) { SurfaceControl_release(surfaceControl); } +ASurfaceControl* ASurfaceControl_fromSurfaceControl(JNIEnv* env, jobject surfaceControlObj) { + return reinterpret_cast( + android_view_SurfaceControl_getNativeSurfaceControl(env, surfaceControlObj)); +} + struct ASurfaceControlStats { std::variant> acquireTimeOrFence; sp previousReleaseFence; @@ -190,6 +199,11 @@ void ASurfaceTransaction_delete(ASurfaceTransaction* aSurfaceTransaction) { delete transaction; } +ASurfaceTransaction* ASurfaceTransaction_fromTransaction(JNIEnv* env, jobject transactionObj) { + return reinterpret_cast( + android_view_SurfaceTransaction_getNativeSurfaceTransaction(env, transactionObj)); +} + void ASurfaceTransaction_apply(ASurfaceTransaction* aSurfaceTransaction) { CHECK_NOT_NULL(aSurfaceTransaction);