NDK methods to get SurfaceControl/Transction from java
Test: ASurfaceControlTest#testSurfaceControl_fromSurfaceControl
and ASurfaceControlTest#testSurfaceTransaction_fromTransaction
Change-Id: Ic15bfaae22b50f70c1c82c8945c09b749654a00f
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index aef38eb..a0a1cb1 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -447,6 +447,7 @@
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 e64b261..2d68359 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -29,6 +29,7 @@
#include <android_runtime/android_graphics_GraphicBuffer.h>
#include <android_runtime/android_hardware_HardwareBuffer.h>
#include <android_runtime/android_view_Surface.h>
+#include <android_runtime/android_view_SurfaceControl.h>
#include <android_runtime/android_view_SurfaceSession.h>
#include <gui/ISurfaceComposer.h>
#include <gui/Surface.h>
@@ -263,8 +264,14 @@
static struct {
jclass clazz;
+ jfieldID mNativeObject;
+} gTransactionClassInfo;
+
+static struct {
+ jclass clazz;
+ jfieldID mNativeObject;
jmethodID invokeReleaseCallback;
-} gInvokeReleaseCallback;
+} gSurfaceControlClassInfo;
class JNamedColorSpace {
public:
@@ -720,10 +727,11 @@
if (fenceCopy) {
fenceCopy->incStrong(0);
}
- globalCallbackRef->env()->CallStaticVoidMethod(gInvokeReleaseCallback.clazz,
- gInvokeReleaseCallback.invokeReleaseCallback,
- globalCallbackRef->object(),
- reinterpret_cast<jlong>(fenceCopy));
+ globalCallbackRef->env()
+ ->CallStaticVoidMethod(gSurfaceControlClassInfo.clazz,
+ gSurfaceControlClassInfo.invokeReleaseCallback,
+ globalCallbackRef->object(),
+ reinterpret_cast<jlong>(fenceCopy));
};
}
@@ -2129,6 +2137,28 @@
// ----------------------------------------------------------------------------
+SurfaceControl* android_view_SurfaceControl_getNativeSurfaceControl(JNIEnv* env,
+ jobject surfaceControlObj) {
+ if (!!surfaceControlObj &&
+ env->IsInstanceOf(surfaceControlObj, gSurfaceControlClassInfo.clazz)) {
+ return reinterpret_cast<SurfaceControl*>(
+ 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<SurfaceComposerClient::Transaction*>(
+ 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 @@
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 0000000..10a7549
--- /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 <gui/SurfaceComposerClient.h>
+#include <gui/SurfaceControl.h>
+
+#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 1f96617..cb0f22f 100644
--- a/native/android/libandroid.map.txt
+++ b/native/android/libandroid.map.txt
@@ -238,6 +238,7 @@
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 @@
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 42f4406..9e4d726 100644
--- a/native/android/surface_control.cpp
+++ b/native/android/surface_control.cpp
@@ -17,6 +17,8 @@
#include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
#include <android/native_window.h>
#include <android/surface_control.h>
+#include <android/surface_control_jni.h>
+#include <android_runtime/android_view_SurfaceControl.h>
#include <configstore/Utils.h>
#include <gui/HdrMetadata.h>
#include <gui/ISurfaceComposer.h>
@@ -28,6 +30,8 @@
#include <ui/DynamicDisplayInfo.h>
#include <utils/Timers.h>
+#include <utility>
+
using namespace android::hardware::configstore;
using namespace android::hardware::configstore::V1_0;
using namespace android;
@@ -134,6 +138,11 @@
SurfaceControl_release(surfaceControl);
}
+ASurfaceControl* ASurfaceControl_fromSurfaceControl(JNIEnv* env, jobject surfaceControlObj) {
+ return reinterpret_cast<ASurfaceControl*>(
+ android_view_SurfaceControl_getNativeSurfaceControl(env, surfaceControlObj));
+}
+
struct ASurfaceControlStats {
std::variant<int64_t, sp<Fence>> acquireTimeOrFence;
sp<Fence> previousReleaseFence;
@@ -190,6 +199,11 @@
delete transaction;
}
+ASurfaceTransaction* ASurfaceTransaction_fromTransaction(JNIEnv* env, jobject transactionObj) {
+ return reinterpret_cast<ASurfaceTransaction*>(
+ android_view_SurfaceTransaction_getNativeSurfaceTransaction(env, transactionObj));
+}
+
void ASurfaceTransaction_apply(ASurfaceTransaction* aSurfaceTransaction) {
CHECK_NOT_NULL(aSurfaceTransaction);