fix: Fix crash when accessing planesCount or bytesPerRow (#380)

* fix: Fix `bytesPerRow` and `planeCount` crashing

* use direct call

* Call `getPlanesCount` and `getBytesPerRow` through java

* revert camerapage changes

* remove removed header import

* Update CameraPage.tsx
This commit is contained in:
Marc Rousavy 2021-08-20 16:02:34 +02:00 committed by GitHub
parent d06bcf648c
commit 0d3f2cbd9d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 28 additions and 13 deletions

View File

@ -22,25 +22,27 @@ int JImageProxy::getHeight() {
return getWidthMethod(self()); return getWidthMethod(self());
} }
alias_ref<JClass> getUtilsClass() {
static const auto ImageProxyUtilsClass = findClassStatic("com/mrousavy/camera/frameprocessor/ImageProxyUtils");
return ImageProxyUtilsClass;
}
bool JImageProxy::getIsValid() { bool JImageProxy::getIsValid() {
static const auto utilsClass = findClassStatic("com/mrousavy/camera/frameprocessor/ImageProxyUtils"); auto utilsClass = getUtilsClass();
static const auto isImageProxyValidMethod = utilsClass->getStaticMethod<jboolean(JImageProxy::javaobject)>("isImageProxyValid"); static const auto isImageProxyValidMethod = utilsClass->getStaticMethod<jboolean(JImageProxy::javaobject)>("isImageProxyValid");
return isImageProxyValidMethod(utilsClass, self()); return isImageProxyValidMethod(utilsClass, self());
} }
int JImageProxy::getPlaneCount() { int JImageProxy::getPlanesCount() {
static const auto getPlanesMethod = getClass()->getMethod<JArrayClass<jobject>()>("getPlanes"); auto utilsClass = getUtilsClass();
auto planes = getPlanesMethod(self()); static const auto getPlanesCountMethod = utilsClass->getStaticMethod<jint(JImageProxy::javaobject)>("getPlanesCount");
return planes->size(); return getPlanesCountMethod(utilsClass, self());
} }
int JImageProxy::getBytesPerRow() { int JImageProxy::getBytesPerRow() {
static const auto getPlanesMethod = getClass()->getMethod<JArrayClass<jobject>()>("getPlanes"); auto utilsClass = getUtilsClass();
auto planes = getPlanesMethod(self()); static const auto getBytesPerRowMethod = utilsClass->getStaticMethod<jint(JImageProxy::javaobject)>("getBytesPerRow");
auto firstPlane = planes->getElement(0); return getBytesPerRowMethod(utilsClass, self());
static const auto getRowStrideMethod = findClassLocal("android/media/Image$PlaneProxy")->getMethod<int()>("getRowStride");
return getRowStrideMethod(firstPlane.get());
} }
void JImageProxy::close() { void JImageProxy::close() {

View File

@ -16,7 +16,7 @@ struct JImageProxy : public facebook::jni::JavaClass<JImageProxy> {
int getWidth(); int getWidth();
int getHeight(); int getHeight();
bool getIsValid(); bool getIsValid();
int getPlaneCount(); int getPlanesCount();
int getBytesPerRow(); int getBytesPerRow();
void close(); void close();
}; };

View File

@ -64,7 +64,7 @@ jsi::Value JImageProxyHostObject::get(jsi::Runtime& runtime, const jsi::PropName
} }
if (name == "planesCount") { if (name == "planesCount") {
this->assertIsFrameStrong(runtime, name); this->assertIsFrameStrong(runtime, name);
return jsi::Value(this->frame->getPlaneCount()); return jsi::Value(this->frame->getPlanesCount());
} }
return jsi::Value::undefined(); return jsi::Value::undefined();

View File

@ -7,6 +7,7 @@ import androidx.annotation.Keep;
import androidx.camera.core.ImageProxy; import androidx.camera.core.ImageProxy;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;
@SuppressWarnings("unused") // used through JNI
@DoNotStrip @DoNotStrip
@Keep @Keep
public class ImageProxyUtils { public class ImageProxyUtils {
@ -26,4 +27,16 @@ public class ImageProxyUtils {
return false; return false;
} }
} }
@DoNotStrip
@Keep
public static int getPlanesCount(ImageProxy imageProxy) {
return imageProxy.getPlanes().length;
}
@DoNotStrip
@Keep
public static int getBytesPerRow(ImageProxy imageProxy) {
return imageProxy.getPlanes()[0].getRowStride();
}
} }