fix: Fix close being called on a collected reference (enforce alias_ref) (#379)

* fix: Fix `close` being called on a collected reference (enforce `alias_ref`)

* Remove `~FrameHostObject` on iOS too
This commit is contained in:
Marc Rousavy 2021-08-20 16:05:02 +02:00 committed by GitHub
parent 97c20d96ae
commit 90f2a1ef7d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 5 additions and 18 deletions

View File

@ -34,9 +34,8 @@ void CameraView::frameProcessorCallback(const alias_ref<JImageProxy::javaobject>
return; return;
} }
auto frameStrong = make_local(frame);
try { try {
frameProcessor_(frameStrong); frameProcessor_(frame);
} catch (const std::exception& exception) { } catch (const std::exception& exception) {
// TODO: jsi::JSErrors cannot be caught on Hermes. They crash the entire app. // TODO: jsi::JSErrors cannot be caught on Hermes. They crash the entire app.
auto message = "Frame Processor threw an error! " + std::string(exception.what()); auto message = "Frame Processor threw an error! " + std::string(exception.what());

View File

@ -14,7 +14,7 @@
namespace vision { namespace vision {
using namespace facebook; using namespace facebook;
using FrameProcessor = std::function<void(jni::local_ref<JImageProxy::javaobject>)>; using FrameProcessor = std::function<void(jni::alias_ref<JImageProxy::javaobject>)>;
class CameraView : public jni::HybridClass<CameraView> { class CameraView : public jni::HybridClass<CameraView> {
public: public:

View File

@ -155,7 +155,7 @@ void FrameProcessorRuntimeManager::installJSIBindings() {
auto function = std::make_shared<jsi::Function>(worklet->getValue(rt).asObject(rt).asFunction(rt)); auto function = std::make_shared<jsi::Function>(worklet->getValue(rt).asObject(rt).asFunction(rt));
// assign lambda to frame processor // assign lambda to frame processor
cameraView->setFrameProcessor([this, &rt, function](jni::local_ref<JImageProxy::javaobject> frame) { cameraView->setFrameProcessor([this, &rt, function](jni::alias_ref<JImageProxy::javaobject> frame) {
try { try {
// create HostObject which holds the Frame (JImageProxy) // create HostObject which holds the Frame (JImageProxy)
auto hostObject = std::make_shared<JImageProxyHostObject>(frame); auto hostObject = std::make_shared<JImageProxyHostObject>(frame);

View File

@ -77,15 +77,9 @@ void JImageProxyHostObject::assertIsFrameStrong(jsi::Runtime& runtime, const std
} }
} }
JImageProxyHostObject::~JImageProxyHostObject() {
this->close();
}
void JImageProxyHostObject::close() { void JImageProxyHostObject::close() {
if (this->frame) { if (this->frame) {
this->frame->close(); this->frame->close();
this->frame.release();
} }
} }

View File

@ -18,8 +18,7 @@ using namespace facebook;
class JSI_EXPORT JImageProxyHostObject : public jsi::HostObject { class JSI_EXPORT JImageProxyHostObject : public jsi::HostObject {
public: public:
explicit JImageProxyHostObject(jni::local_ref<JImageProxy::javaobject> image): frame(image) {} explicit JImageProxyHostObject(jni::alias_ref<JImageProxy::javaobject> image): frame(image) {}
~JImageProxyHostObject();
public: public:
jsi::Value get(jsi::Runtime &, const jsi::PropNameID &name) override; jsi::Value get(jsi::Runtime &, const jsi::PropNameID &name) override;
@ -28,7 +27,7 @@ class JSI_EXPORT JImageProxyHostObject : public jsi::HostObject {
void close(); void close();
public: public:
jni::local_ref<JImageProxy> frame; jni::alias_ref<JImageProxy> frame;
private: private:
static auto constexpr TAG = "VisionCamera"; static auto constexpr TAG = "VisionCamera";

View File

@ -17,7 +17,6 @@ using namespace facebook;
class JSI_EXPORT FrameHostObject: public jsi::HostObject { class JSI_EXPORT FrameHostObject: public jsi::HostObject {
public: public:
explicit FrameHostObject(Frame* frame): frame(frame) {} explicit FrameHostObject(Frame* frame): frame(frame) {}
~FrameHostObject();
public: public:
jsi::Value get(jsi::Runtime&, const jsi::PropNameID& name) override; jsi::Value get(jsi::Runtime&, const jsi::PropNameID& name) override;

View File

@ -89,10 +89,6 @@ void FrameHostObject::assertIsFrameStrong(jsi::Runtime &runtime, const std::stri
} }
} }
FrameHostObject::~FrameHostObject() {
close();
}
void FrameHostObject::close() { void FrameHostObject::close() {
if (frame != nil) { if (frame != nil) {
CMSampleBufferInvalidate(frame.buffer); CMSampleBufferInvalidate(frame.buffer);