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