global ref HardwareBufferRenderer's jclass
Bug: 269803959 Test: app from bug Change-Id: I4a36cf65bfca9e460835df560967a121f677e54d
This commit is contained in:
@@ -46,10 +46,16 @@ public:
|
||||
|
||||
static void setJavaVM(JavaVM* javaVM);
|
||||
|
||||
/** returns a pointer to the JavaVM provided when we initialized the module */
|
||||
/**
|
||||
* returns a pointer to the JavaVM provided when we initialized the module
|
||||
* DEPRECATED: Objects should know the JavaVM that created them
|
||||
*/
|
||||
static JavaVM* getJavaVM() { return mJavaVM; }
|
||||
|
||||
/** return a pointer to the JNIEnv for this thread */
|
||||
/**
|
||||
* return a pointer to the JNIEnv for this thread
|
||||
* DEPRECATED: Objects should know the JavaVM that created them
|
||||
*/
|
||||
static JNIEnv* getJNIEnv();
|
||||
|
||||
/** create a JNIEnv* for this thread or assert if one already exists */
|
||||
@@ -337,13 +343,21 @@ public:
|
||||
JGlobalRefHolder(JavaVM* vm, jobject object) : mVm(vm), mObject(object) {}
|
||||
|
||||
virtual ~JGlobalRefHolder() {
|
||||
GraphicsJNI::getJNIEnv()->DeleteGlobalRef(mObject);
|
||||
env()->DeleteGlobalRef(mObject);
|
||||
mObject = nullptr;
|
||||
}
|
||||
|
||||
jobject object() { return mObject; }
|
||||
JavaVM* vm() { return mVm; }
|
||||
|
||||
JNIEnv* env() {
|
||||
JNIEnv* env;
|
||||
if (mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
|
||||
LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", mVm);
|
||||
}
|
||||
return env;
|
||||
}
|
||||
|
||||
private:
|
||||
JGlobalRefHolder(const JGlobalRefHolder&) = delete;
|
||||
void operator=(const JGlobalRefHolder&) = delete;
|
||||
|
||||
@@ -30,7 +30,10 @@ public:
|
||||
JvmErrorReporter(JNIEnv* env) { env->GetJavaVM(&mVm); }
|
||||
|
||||
virtual void onError(const std::string& message) override {
|
||||
JNIEnv* env = GraphicsJNI::getJNIEnv();
|
||||
JNIEnv* env;
|
||||
if (mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
|
||||
LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", mVm);
|
||||
}
|
||||
jniThrowException(env, "java/lang/IllegalStateException", message.c_str());
|
||||
}
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ static RenderCallback createRenderCallback(JNIEnv* env, jobject releaseCallback)
|
||||
auto globalCallbackRef =
|
||||
std::make_shared<JGlobalRefHolder>(vm, env->NewGlobalRef(releaseCallback));
|
||||
return [globalCallbackRef](android::base::unique_fd&& fd, int status) {
|
||||
GraphicsJNI::getJNIEnv()->CallStaticVoidMethod(
|
||||
globalCallbackRef->env()->CallStaticVoidMethod(
|
||||
gHardwareBufferRendererClassInfo.clazz,
|
||||
gHardwareBufferRendererClassInfo.invokeRenderCallback, globalCallbackRef->object(),
|
||||
reinterpret_cast<jint>(fd.release()), reinterpret_cast<jint>(status));
|
||||
@@ -172,7 +172,8 @@ static const JNINativeMethod gMethods[] = {
|
||||
int register_android_graphics_HardwareBufferRenderer(JNIEnv* env) {
|
||||
jclass hardwareBufferRendererClazz =
|
||||
FindClassOrDie(env, "android/graphics/HardwareBufferRenderer");
|
||||
gHardwareBufferRendererClassInfo.clazz = hardwareBufferRendererClazz;
|
||||
gHardwareBufferRendererClassInfo.clazz =
|
||||
reinterpret_cast<jclass>(env->NewGlobalRef(hardwareBufferRendererClazz));
|
||||
gHardwareBufferRendererClassInfo.invokeRenderCallback =
|
||||
GetStaticMethodIDOrDie(env, hardwareBufferRendererClazz, "invokeRenderCallback",
|
||||
"(Ljava/util/function/Consumer;II)V");
|
||||
|
||||
@@ -94,12 +94,21 @@ struct {
|
||||
jmethodID getDestinationBitmap;
|
||||
} gCopyRequest;
|
||||
|
||||
static JNIEnv* getenv(JavaVM* vm) {
|
||||
JNIEnv* env;
|
||||
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
|
||||
LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", vm);
|
||||
}
|
||||
return env;
|
||||
}
|
||||
|
||||
typedef ANativeWindow* (*ANW_fromSurface)(JNIEnv* env, jobject surface);
|
||||
ANW_fromSurface fromSurface;
|
||||
|
||||
class FrameCommitWrapper : public LightRefBase<FrameCommitWrapper> {
|
||||
public:
|
||||
explicit FrameCommitWrapper(JNIEnv* env, jobject jobject) {
|
||||
env->GetJavaVM(&mVm);
|
||||
mObject = env->NewGlobalRef(jobject);
|
||||
LOG_ALWAYS_FATAL_IF(!mObject, "Failed to make global ref");
|
||||
}
|
||||
@@ -109,18 +118,19 @@ public:
|
||||
void onFrameCommit(bool didProduceBuffer) {
|
||||
if (mObject) {
|
||||
ATRACE_FORMAT("frameCommit success=%d", didProduceBuffer);
|
||||
GraphicsJNI::getJNIEnv()->CallVoidMethod(mObject, gFrameCommitCallback.onFrameCommit,
|
||||
didProduceBuffer);
|
||||
getenv(mVm)->CallVoidMethod(mObject, gFrameCommitCallback.onFrameCommit,
|
||||
didProduceBuffer);
|
||||
releaseObject();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
JavaVM* mVm;
|
||||
jobject mObject;
|
||||
|
||||
void releaseObject() {
|
||||
if (mObject) {
|
||||
GraphicsJNI::getJNIEnv()->DeleteGlobalRef(mObject);
|
||||
getenv(mVm)->DeleteGlobalRef(mObject);
|
||||
mObject = nullptr;
|
||||
}
|
||||
}
|
||||
@@ -541,10 +551,9 @@ static void android_view_ThreadedRenderer_setPictureCapturedCallbackJNI(JNIEnv*
|
||||
auto pictureState = std::make_shared<PictureCaptureState>();
|
||||
proxy->setPictureCapturedCallback([globalCallbackRef,
|
||||
pictureState](sk_sp<SkPicture>&& picture) {
|
||||
JNIEnv* env = GraphicsJNI::getJNIEnv();
|
||||
Picture* wrapper = new PictureWrapper{std::move(picture), pictureState};
|
||||
env->CallStaticVoidMethod(gHardwareRenderer.clazz,
|
||||
gHardwareRenderer.invokePictureCapturedCallback,
|
||||
globalCallbackRef->env()->CallStaticVoidMethod(
|
||||
gHardwareRenderer.clazz, gHardwareRenderer.invokePictureCapturedCallback,
|
||||
static_cast<jlong>(reinterpret_cast<intptr_t>(wrapper)),
|
||||
globalCallbackRef->object());
|
||||
});
|
||||
@@ -561,16 +570,14 @@ static void android_view_ThreadedRenderer_setASurfaceTransactionCallback(
|
||||
LOG_ALWAYS_FATAL_IF(env->GetJavaVM(&vm) != JNI_OK, "Unable to get Java VM");
|
||||
auto globalCallbackRef = std::make_shared<JGlobalRefHolder>(
|
||||
vm, env->NewGlobalRef(aSurfaceTransactionCallback));
|
||||
proxy->setASurfaceTransactionCallback(
|
||||
[globalCallbackRef](int64_t transObj, int64_t scObj, int64_t frameNr) -> bool {
|
||||
JNIEnv* env = GraphicsJNI::getJNIEnv();
|
||||
jboolean ret = env->CallBooleanMethod(
|
||||
globalCallbackRef->object(),
|
||||
gASurfaceTransactionCallback.onMergeTransaction,
|
||||
static_cast<jlong>(transObj), static_cast<jlong>(scObj),
|
||||
static_cast<jlong>(frameNr));
|
||||
return ret;
|
||||
});
|
||||
proxy->setASurfaceTransactionCallback([globalCallbackRef](int64_t transObj, int64_t scObj,
|
||||
int64_t frameNr) -> bool {
|
||||
jboolean ret = globalCallbackRef->env()->CallBooleanMethod(
|
||||
globalCallbackRef->object(), gASurfaceTransactionCallback.onMergeTransaction,
|
||||
static_cast<jlong>(transObj), static_cast<jlong>(scObj),
|
||||
static_cast<jlong>(frameNr));
|
||||
return ret;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -585,9 +592,8 @@ static void android_view_ThreadedRenderer_setPrepareSurfaceControlForWebviewCall
|
||||
auto globalCallbackRef =
|
||||
std::make_shared<JGlobalRefHolder>(vm, env->NewGlobalRef(callback));
|
||||
proxy->setPrepareSurfaceControlForWebviewCallback([globalCallbackRef]() {
|
||||
JNIEnv* env = GraphicsJNI::getJNIEnv();
|
||||
env->CallVoidMethod(globalCallbackRef->object(),
|
||||
gPrepareSurfaceControlForWebviewCallback.prepare);
|
||||
globalCallbackRef->env()->CallVoidMethod(
|
||||
globalCallbackRef->object(), gPrepareSurfaceControlForWebviewCallback.prepare);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -604,7 +610,7 @@ static void android_view_ThreadedRenderer_setFrameCallback(JNIEnv* env,
|
||||
env->NewGlobalRef(frameCallback));
|
||||
proxy->setFrameCallback([globalCallbackRef](int32_t syncResult,
|
||||
int64_t frameNr) -> std::function<void(bool)> {
|
||||
JNIEnv* env = GraphicsJNI::getJNIEnv();
|
||||
JNIEnv* env = globalCallbackRef->env();
|
||||
ScopedLocalRef<jobject> frameCommitCallback(
|
||||
env, env->CallObjectMethod(
|
||||
globalCallbackRef->object(), gFrameDrawingCallback.onFrameDraw,
|
||||
@@ -643,9 +649,8 @@ static void android_view_ThreadedRenderer_setFrameCompleteCallback(JNIEnv* env,
|
||||
auto globalCallbackRef =
|
||||
std::make_shared<JGlobalRefHolder>(vm, env->NewGlobalRef(callback));
|
||||
proxy->setFrameCompleteCallback([globalCallbackRef]() {
|
||||
JNIEnv* env = GraphicsJNI::getJNIEnv();
|
||||
env->CallVoidMethod(globalCallbackRef->object(),
|
||||
gFrameCompleteCallback.onFrameComplete);
|
||||
globalCallbackRef->env()->CallVoidMethod(globalCallbackRef->object(),
|
||||
gFrameCompleteCallback.onFrameComplete);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -656,8 +661,7 @@ public:
|
||||
: CopyRequest(srcRect), mRefHolder(vm, jCopyRequest) {}
|
||||
|
||||
virtual SkBitmap getDestinationBitmap(int srcWidth, int srcHeight) override {
|
||||
JNIEnv* env = GraphicsJNI::getJNIEnv();
|
||||
jlong bitmapPtr = env->CallLongMethod(
|
||||
jlong bitmapPtr = mRefHolder.env()->CallLongMethod(
|
||||
mRefHolder.object(), gCopyRequest.getDestinationBitmap, srcWidth, srcHeight);
|
||||
SkBitmap bitmap;
|
||||
bitmap::toBitmap(bitmapPtr).getSkBitmap(&bitmap);
|
||||
@@ -665,9 +669,8 @@ public:
|
||||
}
|
||||
|
||||
virtual void onCopyFinished(CopyResult result) override {
|
||||
JNIEnv* env = GraphicsJNI::getJNIEnv();
|
||||
env->CallVoidMethod(mRefHolder.object(), gCopyRequest.onCopyFinished,
|
||||
static_cast<jint>(result));
|
||||
mRefHolder.env()->CallVoidMethod(mRefHolder.object(), gCopyRequest.onCopyFinished,
|
||||
static_cast<jint>(result));
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
Reference in New Issue
Block a user