diff --git a/ReactAndroid/src/main/jni/react/jni/NativeCommon.cpp b/ReactAndroid/src/main/jni/react/jni/NativeCommon.cpp index 0f5007350..633792a7d 100644 --- a/ReactAndroid/src/main/jni/react/jni/NativeCommon.cpp +++ b/ReactAndroid/src/main/jni/react/jni/NativeCommon.cpp @@ -14,59 +14,42 @@ const char *gUnexpectedNativeTypeExceptionClass = namespace { -local_ref getTypeField(const char* fieldName) { +// Returns a leaked global_ref. +alias_ref getTypeField(const char* fieldName) { static auto cls = ReadableType::javaClassStatic(); auto field = cls->getStaticField(fieldName); - return cls->getStaticFieldValue(field); -} - -alias_ref getNullValue() { - static alias_ref val = make_global(getTypeField("Null")).release(); - return val; -} - -alias_ref getBooleanValue() { - static alias_ref val = make_global(getTypeField("Boolean")).release(); - return val; -} - -alias_ref getNumberValue() { - static alias_ref val = make_global(getTypeField("Number")).release(); - return val; -} - -alias_ref getStringValue() { - static alias_ref val = make_global(getTypeField("String")).release(); - return val; -} - -alias_ref getMapValue() { - static alias_ref val = make_global(getTypeField("Map")).release(); - return val; -} - -alias_ref getArrayValue() { - static alias_ref val = make_global(getTypeField("Array")).release(); - return val; + return make_global(cls->getStaticFieldValue(field)).release(); } } // namespace local_ref ReadableType::getType(folly::dynamic::Type type) { switch (type) { - case folly::dynamic::Type::NULLT: - return make_local(getNullValue()); - case folly::dynamic::Type::BOOL: - return make_local(getBooleanValue()); + case folly::dynamic::Type::NULLT: { + static alias_ref val = getTypeField("Null"); + return make_local(val); + } + case folly::dynamic::Type::BOOL: { + static alias_ref val = getTypeField("Boolean"); + return make_local(val); + } case folly::dynamic::Type::DOUBLE: - case folly::dynamic::Type::INT64: - return make_local(getNumberValue()); - case folly::dynamic::Type::STRING: - return make_local(getStringValue()); - case folly::dynamic::Type::OBJECT: - return make_local(getMapValue()); - case folly::dynamic::Type::ARRAY: - return make_local(getArrayValue()); + case folly::dynamic::Type::INT64: { + static alias_ref val = getTypeField("Number"); + return make_local(val); + } + case folly::dynamic::Type::STRING: { + static alias_ref val = getTypeField("String"); + return make_local(val); + } + case folly::dynamic::Type::OBJECT: { + static alias_ref val = getTypeField("Map"); + return make_local(val); + } + case folly::dynamic::Type::ARRAY: { + static alias_ref val = getTypeField("Array"); + return make_local(val); + } default: throwNewJavaException(exceptions::gUnexpectedNativeTypeExceptionClass, "Unknown type"); } diff --git a/ReactAndroid/src/main/jni/react/jni/ReadableNativeArray.cpp b/ReactAndroid/src/main/jni/react/jni/ReadableNativeArray.cpp index d4e9faa3f..58df6c88b 100644 --- a/ReactAndroid/src/main/jni/react/jni/ReadableNativeArray.cpp +++ b/ReactAndroid/src/main/jni/react/jni/ReadableNativeArray.cpp @@ -83,6 +83,13 @@ local_ref ReadableNativeArray::getMap(jint index) { return ReadableNativeMap::createWithContents(std::move(array.at(index))); } +namespace { +// This is just to allow signature deduction below. +local_ref getMapFixed(alias_ref array, jint index) { + return static_ref_cast(array->cthis()->getMap(index)); +} +} + void ReadableNativeArray::registerNatives() { registerHybrid({ makeNativeMethod("size", ReadableNativeArray::getSize), @@ -92,8 +99,7 @@ void ReadableNativeArray::registerNatives() { makeNativeMethod("getInt", ReadableNativeArray::getInt), makeNativeMethod("getString", ReadableNativeArray::getString), makeNativeMethod("getArray", ReadableNativeArray::getArray), - makeNativeMethod("getMap", jmethod_traits::descriptor(), - ReadableNativeArray::getMap), + makeNativeMethod("getMap", getMapFixed), makeNativeMethod("getType", ReadableNativeArray::getType), }); }