forked from facebook/react-native
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Release underlying resources when JS instance is GC'ed on Android
Summary: [Android] [Added] - Release underlying resources when JS instance is GC'ed on Android D15279651 introduced a crash for Oculus Twilight on Android (T45199437), so it was reverted by D15611385. This diff fixes the crash and re-applies D15279651. The problem was that ProGuard renamed BlobModule.remove() to BlobModule.release(), but the C++ code in `BlobCollector.cpp` still expected the old name. I confirmed this by looking at the Extracted Symbols file for the build which introduces the crash (https://fburl.com/mobile/ud40od3i): ``` com.facebook.react.modules.blob.BlobModule -> com.facebook.react.modules.blob.BlobModule: ... 8190:8193:void remove(java.lang.String):190:193 -> release ... ``` See the full log file here: https://fburl.com/pn02bwkb. The solution is to annotate the method with `DoNotStrip` so that ProGuard doesn't rename it. Reviewed By: mdvacca, cpojer Differential Revision: D15826082 fbshipit-source-id: f7470d394666cd34c1acae5c6ffaecc84d5ca5a3
- Loading branch information
1 parent
ec39c9e
commit d49a8c1
Showing
11 changed files
with
213 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
25 changes: 25 additions & 0 deletions
25
ReactAndroid/src/main/java/com/facebook/react/modules/blob/BlobCollector.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
package com.facebook.react.modules.blob; | ||
|
||
import com.facebook.react.bridge.JavaScriptContextHolder; | ||
import com.facebook.react.bridge.ReactContext; | ||
import com.facebook.soloader.SoLoader; | ||
|
||
/* package */ class BlobCollector { | ||
static { | ||
SoLoader.loadLibrary("reactnativeblob"); | ||
} | ||
|
||
static void install(final ReactContext reactContext, final BlobModule blobModule) { | ||
reactContext.runOnJSQueueThread(new Runnable() { | ||
@Override | ||
public void run() { | ||
JavaScriptContextHolder jsContext = reactContext.getJavaScriptContextHolder(); | ||
synchronized (jsContext) { | ||
nativeInstall(blobModule, jsContext.get()); | ||
} | ||
} | ||
}); | ||
} | ||
|
||
private native static void nativeInstall(Object blobModule, long jsContext); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
21 changes: 21 additions & 0 deletions
21
ReactAndroid/src/main/java/com/facebook/react/modules/blob/jni/Android.mk
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
# Copyright (c) Facebook, Inc. and its affiliates. | ||
# | ||
# This source code is licensed under the MIT license found in the | ||
# LICENSE file in the root directory of this source tree. | ||
|
||
LOCAL_PATH := $(call my-dir) | ||
|
||
include $(CLEAR_VARS) | ||
|
||
LOCAL_MODULE := reactnativeblob | ||
|
||
LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) | ||
|
||
LOCAL_C_INCLUDES := $(LOCAL_PATH) | ||
|
||
LOCAL_CFLAGS += -fvisibility=hidden -fexceptions -frtti | ||
|
||
LOCAL_STATIC_LIBRARIES := libjsi libjsireact jscruntime | ||
LOCAL_SHARED_LIBRARIES := libfolly_json libfb libreactnativejni | ||
|
||
include $(BUILD_SHARED_LIBRARY) |
22 changes: 22 additions & 0 deletions
22
ReactAndroid/src/main/java/com/facebook/react/modules/blob/jni/BUCK
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
load("//tools/build_defs/oss:rn_defs.bzl", "ANDROID", "FBJNI_TARGET", "react_native_target", "react_native_xplat_target", "rn_xplat_cxx_library") | ||
|
||
rn_xplat_cxx_library( | ||
name = "jni", | ||
srcs = glob(["*.cpp"]), | ||
headers = glob(["*.h"]), | ||
header_namespace = "", | ||
compiler_flags = ["-fexceptions"], | ||
fbandroid_allow_jni_merging = True, | ||
platforms = ANDROID, | ||
soname = "libreactnativeblob.$(ext)", | ||
visibility = [ | ||
"PUBLIC", | ||
], | ||
deps = [ | ||
"fbsource//xplat/folly:molly", | ||
FBJNI_TARGET, | ||
react_native_target("jni/react/jni:jni"), | ||
react_native_xplat_target("jsi:JSCRuntime"), | ||
react_native_xplat_target("jsiexecutor:jsiexecutor"), | ||
], | ||
) |
61 changes: 61 additions & 0 deletions
61
ReactAndroid/src/main/java/com/facebook/react/modules/blob/jni/BlobCollector.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
// Copyright 2004-present Facebook. All Rights Reserved. | ||
// This source code is licensed under the MIT license found in the | ||
// LICENSE file in the root directory of this source tree. | ||
|
||
#include "BlobCollector.h" | ||
|
||
#include <fb/fbjni.h> | ||
#include <memory> | ||
#include <mutex> | ||
|
||
using namespace facebook; | ||
|
||
namespace facebook { | ||
namespace react { | ||
|
||
static constexpr auto kBlobModuleJavaDescriptor = | ||
"com/facebook/react/modules/blob/BlobModule"; | ||
|
||
BlobCollector::BlobCollector( | ||
jni::global_ref<jobject> blobModule, | ||
const std::string &blobId) | ||
: blobModule_(blobModule), blobId_(blobId) {} | ||
|
||
BlobCollector::~BlobCollector() { | ||
auto removeMethod = jni::findClassStatic(kBlobModuleJavaDescriptor) | ||
->getMethod<void(jstring)>("remove"); | ||
removeMethod(blobModule_, jni::make_jstring(blobId_).get()); | ||
} | ||
|
||
void BlobCollector::nativeInstall( | ||
jni::alias_ref<jhybridobject> jThis, | ||
jni::alias_ref<jobject> blobModule, | ||
jlong jsContextNativePointer) { | ||
auto &runtime = *((jsi::Runtime *)jsContextNativePointer); | ||
auto blobModuleRef = jni::make_global(blobModule); | ||
runtime.global().setProperty( | ||
runtime, | ||
"__blobCollectorProvider", | ||
jsi::Function::createFromHostFunction( | ||
runtime, | ||
jsi::PropNameID::forAscii(runtime, "__blobCollectorProvider"), | ||
1, | ||
[blobModuleRef]( | ||
jsi::Runtime &rt, | ||
const jsi::Value &thisVal, | ||
const jsi::Value *args, | ||
size_t count) { | ||
auto blobId = args[0].asString(rt).utf8(rt); | ||
auto blobCollector = | ||
std::make_shared<BlobCollector>(blobModuleRef, blobId); | ||
return jsi::Object::createFromHostObject(rt, blobCollector); | ||
})); | ||
} | ||
|
||
void BlobCollector::registerNatives() { | ||
registerHybrid( | ||
{makeNativeMethod("nativeInstall", BlobCollector::nativeInstall)}); | ||
} | ||
|
||
} // namespace react | ||
} // namespace facebook |
39 changes: 39 additions & 0 deletions
39
ReactAndroid/src/main/java/com/facebook/react/modules/blob/jni/BlobCollector.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
// Copyright 2004-present Facebook. All Rights Reserved. | ||
// This source code is licensed under the MIT license found in the | ||
// LICENSE file in the root directory of this source tree. | ||
|
||
#pragma once | ||
|
||
#include <fb/fbjni.h> | ||
#include <jsi/jsi.h> | ||
|
||
namespace facebook { | ||
namespace react { | ||
|
||
class BlobCollector : public jni::HybridClass<BlobCollector>, | ||
public jsi::HostObject { | ||
public: | ||
BlobCollector( | ||
jni::global_ref<jobject> blobManager, | ||
const std::string &blobId); | ||
~BlobCollector(); | ||
|
||
static constexpr auto kJavaDescriptor = | ||
"Lcom/facebook/react/modules/blob/BlobCollector;"; | ||
|
||
static void nativeInstall( | ||
jni::alias_ref<jhybridobject> jThis, | ||
jni::alias_ref<jobject> blobModule, | ||
jlong jsContextNativePointer); | ||
|
||
static void registerNatives(); | ||
|
||
private: | ||
friend HybridBase; | ||
|
||
jni::global_ref<jobject> blobModule_; | ||
const std::string blobId_; | ||
}; | ||
|
||
} // namespace react | ||
} // namespace facebook |
13 changes: 13 additions & 0 deletions
13
ReactAndroid/src/main/java/com/facebook/react/modules/blob/jni/OnLoad.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
// Copyright 2004-present Facebook. All Rights Reserved. | ||
|
||
// This source code is licensed under the MIT license found in the | ||
// LICENSE file in the root directory of this source tree. | ||
|
||
#include <fb/fbjni.h> | ||
|
||
#include "BlobCollector.h" | ||
|
||
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { | ||
return facebook::jni::initialize( | ||
vm, [] { facebook::react::BlobCollector::registerNatives(); }); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters