diff --git a/package/android/gradle/wrapper/gradle-wrapper.properties b/package/android/gradle/wrapper/gradle-wrapper.properties index 8fad3f5..f407850 100644 --- a/package/android/gradle/wrapper/gradle-wrapper.properties +++ b/package/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/package/android/src/main/cpp/VisionCamera.cpp b/package/android/src/main/cpp/VisionCamera.cpp index e46a7f0..9e73f90 100644 --- a/package/android/src/main/cpp/VisionCamera.cpp +++ b/package/android/src/main/cpp/VisionCamera.cpp @@ -9,11 +9,13 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) { return facebook::jni::initialize(vm, [] { + // VideoPipeline is needed for video recording even without Frame Processors + vision::VideoPipeline::registerNatives(); +#if VISION_CAMERA_ENABLE_FRAME_PROCESSORS + // Frame Processor JNI bindings - only register when Frame Processors are enabled vision::VisionCameraInstaller::registerNatives(); vision::JVisionCameraProxy::registerNatives(); vision::JVisionCameraScheduler::registerNatives(); - vision::VideoPipeline::registerNatives(); -#if VISION_CAMERA_ENABLE_FRAME_PROCESSORS vision::JFrameProcessor::registerNatives(); vision::JSharedArray::registerNatives(); #endif diff --git a/package/android/src/main/java/com/mrousavy/camera/CameraViewModule.kt b/package/android/src/main/java/com/mrousavy/camera/CameraViewModule.kt index 15075d7..baeafba 100644 --- a/package/android/src/main/java/com/mrousavy/camera/CameraViewModule.kt +++ b/package/android/src/main/java/com/mrousavy/camera/CameraViewModule.kt @@ -29,10 +29,16 @@ class CameraViewModule(reactContext: ReactApplicationContext) : ReactContextBase var sharedRequestCode = 10 init { - // Skip loading native library for React Native 0.79+ compatibility - // Frame Processors are disabled (react-native-worklets-core not installed) - // The native library has incompatible JNI signatures for RN 0.79+ - Log.i(TAG, "VisionCamera native library not loaded - Frame Processors disabled for RN 0.79+ compatibility") + try { + // Load the native part of VisionCamera. + // Includes the OpenGL VideoPipeline (needed for video recording) + // Frame Processors remain disabled for RN 0.79+ compatibility + System.loadLibrary("VisionCamera") + Log.i(TAG, "VisionCamera native library loaded successfully") + } catch (e: UnsatisfiedLinkError) { + Log.e(TAG, "Failed to load VisionCamera C++ library!", e) + throw e + } } } diff --git a/package/android/src/main/java/com/mrousavy/camera/frameprocessor/VisionCameraProxy.kt b/package/android/src/main/java/com/mrousavy/camera/frameprocessor/VisionCameraProxy.kt index d77a2fe..9918b7a 100644 --- a/package/android/src/main/java/com/mrousavy/camera/frameprocessor/VisionCameraProxy.kt +++ b/package/android/src/main/java/com/mrousavy/camera/frameprocessor/VisionCameraProxy.kt @@ -9,7 +9,6 @@ import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.UiThreadUtil -// import com.facebook.react.turbomodule.core.CallInvokerHolderImpl // Commented out due to RN 0.79+ compatibility import com.facebook.react.uimanager.UIManagerHelper import com.mrousavy.camera.CameraView import com.mrousavy.camera.core.ViewNotFoundError @@ -78,9 +77,9 @@ class VisionCameraProxy(private val reactContext: ReactApplicationContext) { FrameProcessorPluginRegistry.getPlugin(name, this, options) // private C++ funcs - // Keep this declared (even though we don't call it) so JNI can register it - // The native library expects this method signature to exist - @DoNotStrip - @Keep - private external fun initHybrid(jsContext: Long, jsCallInvokerHolder: Any, scheduler: VisionCameraScheduler): HybridData + // Frame Processors are disabled - native registration is skipped via VISION_CAMERA_ENABLE_FRAME_PROCESSORS=OFF + // This method is never called or registered, kept for reference only + // @DoNotStrip + // @Keep + // private external fun initHybrid(jsContext: Long, jsCallInvokerHolder: Any, scheduler: VisionCameraScheduler): HybridData }