Dont hold strong reference to java objects creating a cycle
Summary: Use weak reference to avoid cycle Reviewed By: splhack Differential Revision: D4064773 fbshipit-source-id: 4088fef5e088a8415747898ef17851e21ada5180
This commit is contained in:
committed by
Facebook Github Bot
parent
e9b9973cae
commit
97fef59f96
@@ -15,7 +15,7 @@ using namespace facebook::jni;
|
||||
using namespace std;
|
||||
|
||||
static void _jniPrint(void *context) {
|
||||
const auto obj = wrap_alias(reinterpret_cast<jobject>(context));
|
||||
auto obj = adopt_local(Environment::current()->NewLocalRef(reinterpret_cast<jweak>(context)));
|
||||
cout << obj->toString() << endl;
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ static CSSSize _jniMeasureFunc(void *context,
|
||||
CSSMeasureMode widthMode,
|
||||
float height,
|
||||
CSSMeasureMode heightMode) {
|
||||
const auto obj = wrap_alias(reinterpret_cast<jobject>(context));
|
||||
auto obj = adopt_local(Environment::current()->NewLocalRef(reinterpret_cast<jweak>(context)));
|
||||
static auto measureFunc =
|
||||
obj->getClass()->getMethod<jlong(jfloat, jint, jfloat, jint)>("measure");
|
||||
const auto measureResult = measureFunc(obj, width, widthMode, height, heightMode);
|
||||
@@ -34,6 +34,7 @@ static CSSSize _jniMeasureFunc(void *context,
|
||||
|
||||
const float measuredWidth = static_cast<float>(0xFFFFFFFF & (measureResult >> 32));
|
||||
const float measuredHeight = static_cast<float>(0xFFFFFFFF & measureResult);
|
||||
|
||||
return CSSSize{measuredWidth, measuredHeight};
|
||||
}
|
||||
|
||||
@@ -47,15 +48,14 @@ jint jni_CSSNodeGetInstanceCount(alias_ref<jclass> clazz) {
|
||||
|
||||
jlong jni_CSSNodeNew(alias_ref<jobject> thiz) {
|
||||
const CSSNodeRef node = CSSNodeNew();
|
||||
auto globalThiz = make_global(thiz);
|
||||
CSSNodeSetContext(node, globalThiz.release());
|
||||
CSSNodeSetContext(node, Environment::current()->NewWeakGlobalRef(thiz.get()));
|
||||
CSSNodeSetPrintFunc(node, _jniPrint);
|
||||
return reinterpret_cast<jlong>(node);
|
||||
}
|
||||
|
||||
void jni_CSSNodeFree(alias_ref<jobject> thiz, jlong nativePointer) {
|
||||
const auto globalContext =
|
||||
adopt_global(reinterpret_cast<jobject>(CSSNodeGetContext(_jlong2CSSNodeRef(nativePointer))));
|
||||
Environment::current()->DeleteWeakGlobalRef(
|
||||
reinterpret_cast<jweak>(CSSNodeGetContext(_jlong2CSSNodeRef(nativePointer))));
|
||||
CSSNodeFree(_jlong2CSSNodeRef(nativePointer));
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user