Skip to content
This repository was archived by the owner on Oct 23, 2023. It is now read-only.

Commit 0723cc0

Browse files
committed
Fix issue with JNI Env not available (#177)
Summary: Pull Request resolved: #177 The Hermes GC will eventually clean up orphan host objects. This is also the case for `ImageHostObject`, which itself has a reference to `Image` that needs to be cleaned up, hence the call to the `Image::~Image` destructor. On Android, it will try to release the `global_ref<JImage>` resource, which at the time, may not run in the JVM thread scope causing an app carsh with an error like: ``` Abort message: 'terminating with uncaught exception of type std::runtime_error: Unable to retrieve jni environment. Is the thread attached?' ``` ``` /data/app/~~tGo_W1LgnykvwiT9t7jBtQ==/dev.playtorch-NUv9YPDoqWoQiv-dKR2ylA==/lib/arm64/libtorchlive.so (__clang_call_terminate+8) (BuildId: 0a803d5f698a12e07d4c31b32095ee75a8eefd87) 12-10 18:51:24.290 20638 20638 F DEBUG : #6 pc 0000000000088f00 /data/app/~~tGo_W1LgnykvwiT9t7jBtQ==/dev.playtorch-NUv9YPDoqWoQiv-dKR2ylA==/lib/arm64/libtorchlive.so (torchlive::media::Image::~Image()+92) (BuildId: 0a803d5f698a12e07d4c31b32095ee75a8eefd87) 12-10 18:51:24.290 20638 20638 F DEBUG : #7 pc 0000000000043874 /data/app/~~tGo_W1LgnykvwiT9t7jBtQ==/dev.playtorch-NUv9YPDoqWoQiv-dKR2ylA==/lib/arm64/libtorchlive.so (torchlive::media::ImageHostObject::~ImageHostObject()+76) (BuildId: 0a803d5f698a12e07d4c31b32095ee75a8eefd87) 12-10 18:51:24.290 20638 20638 F DEBUG : #8 pc 000000000001cc20 /data/app/~~tGo_W1LgnykvwiT9t7jBtQ==/dev.playtorch-NUv9YPDoqWoQiv-dKR2ylA==/lib/arm64/libhermes-executor-release.so (facebook::jsi::DecoratedHostObject::~DecoratedHostObject()+76) (BuildId: f9ec095fd26bd03ab3b56d56ec655670c546c472) 12-10 18:51:24.290 20638 20638 F DEBUG : #9 pc 000000000007033c /data/app/~~tGo_W1LgnykvwiT9t7jBtQ==/dev.playtorch-NUv9YPDoqWoQiv-dKR2ylA==/lib/arm64/libhermes.so (BuildId: 957ec0f39e08feadc6d0ec99bbe00fa14a3687b3) ``` Reported here: #175 This change ensures that the image instance release happens within the JVM environment. More details: https://github.com/facebookincubator/fbjni/blob/5eacdd11c5d9c46f5a752faad3457f3b07fe40cb/cxx/fbjni/detail/Environment.h#L114 Reviewed By: ansonsyfang Differential Revision: D41919866 fbshipit-source-id: 103fb2d5bdadf42e8d79882874147abe58d3a1c2
1 parent 68d976f commit 0723cc0

File tree

2 files changed

+8
-1
lines changed
  • react-native-pytorch-core/android/src/main/cpp/torchlive/media/image

2 files changed

+8
-1
lines changed

react-native-pytorch-core/android/src/main/cpp/torchlive/media/image/Image.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ Image::Image(facebook::jni::alias_ref<JIImage> image)
3333
id_ = wrapObjectMethod(mediaUtilsClass, image)->toStdString();
3434
}
3535

36+
Image::~Image() {
37+
ThreadScope::WithClassLoader([&]() {
38+
Environment::ensureCurrentThreadIsAttached();
39+
this->image_.release();
40+
});
41+
}
42+
3643
std::string Image::getId() const {
3744
return id_;
3845
}

react-native-pytorch-core/android/src/main/cpp/torchlive/media/image/Image.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ namespace media {
1919
class Image : public IImage {
2020
public:
2121
Image(facebook::jni::alias_ref<JIImage> image);
22-
~Image() override = default;
22+
~Image() override;
2323

2424
std::string getId() const override;
2525

0 commit comments

Comments
 (0)