Compare commits
1 Commits
loewy/fix-
...
bump-react
| Author | SHA1 | Date | |
|---|---|---|---|
| ac06fa5f56 |
@@ -19,7 +19,9 @@ endif()
|
|||||||
|
|
||||||
|
|
||||||
# Add react-native-vision-camera sources
|
# Add react-native-vision-camera sources
|
||||||
set(SOURCES
|
add_library(
|
||||||
|
${PACKAGE_NAME}
|
||||||
|
SHARED
|
||||||
# Shared C++
|
# Shared C++
|
||||||
../cpp/MutableRawBuffer.cpp
|
../cpp/MutableRawBuffer.cpp
|
||||||
# Java JNI
|
# Java JNI
|
||||||
@@ -29,33 +31,17 @@ set(SOURCES
|
|||||||
src/main/cpp/OpenGLContext.cpp
|
src/main/cpp/OpenGLContext.cpp
|
||||||
src/main/cpp/OpenGLRenderer.cpp
|
src/main/cpp/OpenGLRenderer.cpp
|
||||||
src/main/cpp/MutableJByteBuffer.cpp
|
src/main/cpp/MutableJByteBuffer.cpp
|
||||||
)
|
# Frame Processor
|
||||||
|
src/main/cpp/frameprocessor/FrameHostObject.cpp
|
||||||
# Only add Frame Processor sources if enabled
|
src/main/cpp/frameprocessor/FrameProcessorPluginHostObject.cpp
|
||||||
if (ENABLE_FRAME_PROCESSORS)
|
src/main/cpp/frameprocessor/JSIJNIConversion.cpp
|
||||||
list(APPEND SOURCES
|
src/main/cpp/frameprocessor/VisionCameraProxy.cpp
|
||||||
src/main/cpp/frameprocessor/FrameHostObject.cpp
|
src/main/cpp/frameprocessor/java-bindings/JSharedArray.cpp
|
||||||
src/main/cpp/frameprocessor/FrameProcessorPluginHostObject.cpp
|
src/main/cpp/frameprocessor/java-bindings/JFrame.cpp
|
||||||
src/main/cpp/frameprocessor/JSIJNIConversion.cpp
|
src/main/cpp/frameprocessor/java-bindings/JFrameProcessor.cpp
|
||||||
src/main/cpp/frameprocessor/VisionCameraProxy.cpp
|
src/main/cpp/frameprocessor/java-bindings/JFrameProcessorPlugin.cpp
|
||||||
src/main/cpp/frameprocessor/java-bindings/JSharedArray.cpp
|
src/main/cpp/frameprocessor/java-bindings/JVisionCameraProxy.cpp
|
||||||
src/main/cpp/frameprocessor/java-bindings/JFrame.cpp
|
src/main/cpp/frameprocessor/java-bindings/JVisionCameraScheduler.cpp
|
||||||
src/main/cpp/frameprocessor/java-bindings/JFrameProcessor.cpp
|
|
||||||
src/main/cpp/frameprocessor/java-bindings/JFrameProcessorPlugin.cpp
|
|
||||||
src/main/cpp/frameprocessor/java-bindings/JVisionCameraProxy.cpp
|
|
||||||
src/main/cpp/frameprocessor/java-bindings/JVisionCameraScheduler.cpp
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_library(
|
|
||||||
${PACKAGE_NAME}
|
|
||||||
SHARED
|
|
||||||
${SOURCES}
|
|
||||||
)
|
|
||||||
|
|
||||||
# Force 16KB page alignment for Android 15+ compatibility
|
|
||||||
set_target_properties(${PACKAGE_NAME} PROPERTIES
|
|
||||||
LINK_FLAGS "-Wl,-z,max-page-size=16384"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Header Search Paths (includes)
|
# Header Search Paths (includes)
|
||||||
@@ -74,13 +60,13 @@ target_include_directories(
|
|||||||
# Link everything together
|
# Link everything together
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
${PACKAGE_NAME}
|
${PACKAGE_NAME}
|
||||||
${LOG_LIB} # <-- Logcat logger
|
${LOG_LIB} # <-- Logcat logger
|
||||||
android # <-- Android JNI core
|
android # <-- Android JNI core
|
||||||
ReactAndroid::jsi # <-- RN: JSI
|
ReactAndroid::jsi # <-- RN: JSI
|
||||||
ReactAndroid::reactnative # <-- RN: React Native JNI bindings (RN 0.76+)
|
# ReactAndroid::reactnativejni # <-- Temporarily disabled for RN 0.79+ compatibility
|
||||||
fbjni::fbjni # <-- fbjni
|
fbjni::fbjni # <-- fbjni
|
||||||
GLESv2 # <-- OpenGL (for VideoPipeline)
|
GLESv2 # <-- OpenGL (for VideoPipeline)
|
||||||
EGL # <-- OpenGL (EGL) (for VideoPipeline)
|
EGL # <-- OpenGL (EGL) (for VideoPipeline)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Optionally also add Frame Processors here
|
# Optionally also add Frame Processors here
|
||||||
|
|||||||
@@ -133,16 +133,8 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
compileOptions {
|
compileOptions {
|
||||||
sourceCompatibility JavaVersion.VERSION_17
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
targetCompatibility JavaVersion.VERSION_17
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
}
|
|
||||||
|
|
||||||
kotlinOptions {
|
|
||||||
jvmTarget = "17"
|
|
||||||
freeCompilerArgs += [
|
|
||||||
"-opt-in=kotlin.RequiresOptIn",
|
|
||||||
"-opt-in=com.facebook.react.annotations.UnstableReactNativeAPI"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
externalNativeBuild {
|
externalNativeBuild {
|
||||||
@@ -165,7 +157,6 @@ android {
|
|||||||
"**/libhermes-executor-debug.so",
|
"**/libhermes-executor-debug.so",
|
||||||
"**/libhermes_executor.so",
|
"**/libhermes_executor.so",
|
||||||
"**/libreactnativejni.so",
|
"**/libreactnativejni.so",
|
||||||
"**/libreactnative.so",
|
|
||||||
"**/libturbomodulejsijni.so",
|
"**/libturbomodulejsijni.so",
|
||||||
"**/libreact_nativemodule_core.so",
|
"**/libreact_nativemodule_core.so",
|
||||||
"**/libjscexecutor.so"
|
"**/libjscexecutor.so"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|||||||
@@ -9,13 +9,11 @@
|
|||||||
|
|
||||||
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {
|
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {
|
||||||
return facebook::jni::initialize(vm, [] {
|
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::VisionCameraInstaller::registerNatives();
|
||||||
vision::JVisionCameraProxy::registerNatives();
|
vision::JVisionCameraProxy::registerNatives();
|
||||||
vision::JVisionCameraScheduler::registerNatives();
|
vision::JVisionCameraScheduler::registerNatives();
|
||||||
|
vision::VideoPipeline::registerNatives();
|
||||||
|
#if VISION_CAMERA_ENABLE_FRAME_PROCESSORS
|
||||||
vision::JFrameProcessor::registerNatives();
|
vision::JFrameProcessor::registerNatives();
|
||||||
vision::JSharedArray::registerNatives();
|
vision::JSharedArray::registerNatives();
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class CameraViewManager : ViewGroupManager<CameraView>() {
|
|||||||
.put("cameraError", MapBuilder.of("registrationName", "onError"))
|
.put("cameraError", MapBuilder.of("registrationName", "onError"))
|
||||||
.put("cameraCodeScanned", MapBuilder.of("registrationName", "onCodeScanned"))
|
.put("cameraCodeScanned", MapBuilder.of("registrationName", "onCodeScanned"))
|
||||||
.put("onVideoChunkReady", MapBuilder.of("registrationName", "onVideoChunkReady"))
|
.put("onVideoChunkReady", MapBuilder.of("registrationName", "onVideoChunkReady"))
|
||||||
.build()?.toMutableMap()
|
.build()
|
||||||
|
|
||||||
override fun getName(): String = TAG
|
override fun getName(): String = TAG
|
||||||
|
|
||||||
|
|||||||
@@ -31,12 +31,10 @@ class CameraViewModule(reactContext: ReactApplicationContext) : ReactContextBase
|
|||||||
init {
|
init {
|
||||||
try {
|
try {
|
||||||
// Load the native part of VisionCamera.
|
// Load the native part of VisionCamera.
|
||||||
// Includes the OpenGL VideoPipeline (needed for video recording)
|
// Includes the OpenGL VideoPipeline, as well as Frame Processor JSI bindings
|
||||||
// Frame Processors remain disabled for RN 0.79+ compatibility
|
|
||||||
System.loadLibrary("VisionCamera")
|
System.loadLibrary("VisionCamera")
|
||||||
Log.i(TAG, "VisionCamera native library loaded successfully")
|
|
||||||
} catch (e: UnsatisfiedLinkError) {
|
} catch (e: UnsatisfiedLinkError) {
|
||||||
Log.e(TAG, "Failed to load VisionCamera C++ library!", e)
|
Log.e(VisionCameraProxy.TAG, "Failed to load VisionCamera C++ library!", e)
|
||||||
throw e
|
throw e
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -75,11 +73,15 @@ class CameraViewModule(reactContext: ReactApplicationContext) : ReactContextBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ReactMethod(isBlockingSynchronousMethod = true)
|
@ReactMethod(isBlockingSynchronousMethod = true)
|
||||||
fun installFrameProcessorBindings(): Boolean {
|
fun installFrameProcessorBindings(): Boolean =
|
||||||
// Frame Processors are disabled for React Native 0.79+ compatibility
|
try {
|
||||||
Log.i(TAG, "Frame Processor bindings not installed - Frame Processors disabled for RN 0.79+ compatibility")
|
val proxy = VisionCameraProxy(reactApplicationContext)
|
||||||
return false
|
VisionCameraInstaller.install(proxy)
|
||||||
}
|
true
|
||||||
|
} catch (e: Error) {
|
||||||
|
Log.e(TAG, "Failed to install Frame Processor JSI Bindings!", e)
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
@ReactMethod
|
@ReactMethod
|
||||||
fun takePhoto(viewTag: Int, options: ReadableMap, promise: Promise) {
|
fun takePhoto(viewTag: Int, options: ReadableMap, promise: Promise) {
|
||||||
@@ -155,7 +157,7 @@ class CameraViewModule(reactContext: ReactApplicationContext) : ReactContextBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun canRequestPermission(permission: String): Boolean {
|
private fun canRequestPermission(permission: String): Boolean {
|
||||||
val activity = reactApplicationContext.currentActivity as? PermissionAwareActivity
|
val activity = currentActivity as? PermissionAwareActivity
|
||||||
return activity?.shouldShowRequestPermissionRationale(permission) ?: false
|
return activity?.shouldShowRequestPermissionRationale(permission) ?: false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ import android.util.Log
|
|||||||
import android.util.Size
|
import android.util.Size
|
||||||
import android.view.Surface
|
import android.view.Surface
|
||||||
import android.view.SurfaceHolder
|
import android.view.SurfaceHolder
|
||||||
import android.view.WindowManager
|
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import com.google.mlkit.vision.barcode.common.Barcode
|
import com.google.mlkit.vision.barcode.common.Barcode
|
||||||
import com.mrousavy.camera.core.capture.RepeatingCaptureRequest
|
import com.mrousavy.camera.core.capture.RepeatingCaptureRequest
|
||||||
@@ -426,19 +425,6 @@ class CameraSession(private val context: Context, private val cameraManager: Cam
|
|||||||
|
|
||||||
val fps = configuration?.fps ?: 30
|
val fps = configuration?.fps ?: 30
|
||||||
|
|
||||||
// Get actual device rotation from WindowManager instead of relying on
|
|
||||||
// the orientation prop from React, which may not update on Android when
|
|
||||||
// rotating between landscape-left and landscape-right.
|
|
||||||
val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
|
|
||||||
val deviceRotation = windowManager.defaultDisplay.rotation
|
|
||||||
val actualOrientation = when (deviceRotation) {
|
|
||||||
Surface.ROTATION_0 -> Orientation.PORTRAIT
|
|
||||||
Surface.ROTATION_90 -> Orientation.LANDSCAPE_LEFT
|
|
||||||
Surface.ROTATION_180 -> Orientation.PORTRAIT_UPSIDE_DOWN
|
|
||||||
Surface.ROTATION_270 -> Orientation.LANDSCAPE_RIGHT
|
|
||||||
else -> Orientation.PORTRAIT
|
|
||||||
}
|
|
||||||
|
|
||||||
val recording = RecordingSession(
|
val recording = RecordingSession(
|
||||||
context,
|
context,
|
||||||
cameraId,
|
cameraId,
|
||||||
|
|||||||
@@ -9,10 +9,8 @@ import android.os.Looper
|
|||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.util.Size
|
import android.util.Size
|
||||||
import android.view.PixelCopy
|
import android.view.PixelCopy
|
||||||
import android.view.Surface
|
|
||||||
import android.view.SurfaceHolder
|
import android.view.SurfaceHolder
|
||||||
import android.view.SurfaceView
|
import android.view.SurfaceView
|
||||||
import android.view.WindowManager
|
|
||||||
import com.facebook.react.bridge.UiThreadUtil
|
import com.facebook.react.bridge.UiThreadUtil
|
||||||
import com.mrousavy.camera.extensions.resize
|
import com.mrousavy.camera.extensions.resize
|
||||||
import com.mrousavy.camera.extensions.rotatedBy
|
import com.mrousavy.camera.extensions.rotatedBy
|
||||||
@@ -152,8 +150,6 @@ class PreviewView(context: Context, callback: SurfaceHolder.Callback) :
|
|||||||
val width = frame.width()
|
val width = frame.width()
|
||||||
val height = frame.height()
|
val height = frame.height()
|
||||||
|
|
||||||
// Create bitmap matching surface frame dimensions for PixelCopy
|
|
||||||
// The original code swapped dimensions assuming landscape input - keep that for consistency
|
|
||||||
val bitmap = Bitmap.createBitmap(height, width, Bitmap.Config.ARGB_8888)
|
val bitmap = Bitmap.createBitmap(height, width, Bitmap.Config.ARGB_8888)
|
||||||
|
|
||||||
// Use a coroutine to suspend until the PixelCopy request is complete
|
// Use a coroutine to suspend until the PixelCopy request is complete
|
||||||
@@ -163,23 +159,7 @@ class PreviewView(context: Context, callback: SurfaceHolder.Callback) :
|
|||||||
bitmap,
|
bitmap,
|
||||||
{ copyResult ->
|
{ copyResult ->
|
||||||
if (copyResult == PixelCopy.SUCCESS) {
|
if (copyResult == PixelCopy.SUCCESS) {
|
||||||
// Get actual device rotation from WindowManager instead of relying on
|
continuation.resume(rotateBitmap90CounterClockwise(bitmap))
|
||||||
// the orientation prop, which may not update on Android when rotating
|
|
||||||
// between landscape-left and landscape-right.
|
|
||||||
val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
|
|
||||||
val deviceRotation = windowManager.defaultDisplay.rotation
|
|
||||||
|
|
||||||
val actualOrientation = when (deviceRotation) {
|
|
||||||
Surface.ROTATION_0 -> Orientation.PORTRAIT
|
|
||||||
Surface.ROTATION_90 -> Orientation.LANDSCAPE_LEFT
|
|
||||||
Surface.ROTATION_180 -> Orientation.PORTRAIT_UPSIDE_DOWN
|
|
||||||
Surface.ROTATION_270 -> Orientation.LANDSCAPE_RIGHT
|
|
||||||
else -> Orientation.PORTRAIT
|
|
||||||
}
|
|
||||||
|
|
||||||
Log.i(TAG, "getBitmap: orientation prop = $orientation, deviceRotation = $deviceRotation, actualOrientation = $actualOrientation")
|
|
||||||
|
|
||||||
continuation.resume(bitmap.transformBitmap(actualOrientation))
|
|
||||||
} else {
|
} else {
|
||||||
continuation.resumeWithException(
|
continuation.resumeWithException(
|
||||||
RuntimeException("PixelCopy failed with error code $copyResult")
|
RuntimeException("PixelCopy failed with error code $copyResult")
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import com.facebook.jni.HybridData
|
|||||||
import com.facebook.proguard.annotations.DoNotStrip
|
import com.facebook.proguard.annotations.DoNotStrip
|
||||||
import com.facebook.react.bridge.ReactApplicationContext
|
import com.facebook.react.bridge.ReactApplicationContext
|
||||||
import com.facebook.react.bridge.UiThreadUtil
|
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.facebook.react.uimanager.UIManagerHelper
|
||||||
import com.mrousavy.camera.CameraView
|
import com.mrousavy.camera.CameraView
|
||||||
import com.mrousavy.camera.core.ViewNotFoundError
|
import com.mrousavy.camera.core.ViewNotFoundError
|
||||||
@@ -77,9 +78,6 @@ class VisionCameraProxy(private val reactContext: ReactApplicationContext) {
|
|||||||
FrameProcessorPluginRegistry.getPlugin(name, this, options)
|
FrameProcessorPluginRegistry.getPlugin(name, this, options)
|
||||||
|
|
||||||
// private C++ funcs
|
// private C++ funcs
|
||||||
// Frame Processors are disabled - native registration is skipped via VISION_CAMERA_ENABLE_FRAME_PROCESSORS=OFF
|
// Commented out due to React Native 0.79+ API compatibility issues
|
||||||
// This method is never called or registered, kept for reference only
|
// private external fun initHybrid(jsContext: Long, jsCallInvokerHolder: CallInvokerHolderImpl, scheduler: VisionCameraScheduler): HybridData
|
||||||
// @DoNotStrip
|
|
||||||
// @Keep
|
|
||||||
// private external fun initHybrid(jsContext: Long, jsCallInvokerHolder: Any, scheduler: VisionCameraScheduler): HybridData
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user