Skip to content

Instantly share code, notes, and snippets.

@jzxchiang1
Created November 26, 2021 19:38
Show Gist options
  • Save jzxchiang1/012af920bca8b335faab2d913fd6293d to your computer and use it in GitHub Desktop.
Save jzxchiang1/012af920bca8b335faab2d913fd6293d to your computer and use it in GitHub Desktop.
How to get react-native-vision-camera working on v8
diff --git a/node_modules/react-native-vision-camera/android/CMakeLists.txt b/node_modules/react-native-vision-camera/android/CMakeLists.txt
index ab15dc3..d0c8f8e 100644
--- a/node_modules/react-native-vision-camera/android/CMakeLists.txt
+++ b/node_modules/react-native-vision-camera/android/CMakeLists.txt
@@ -6,7 +6,7 @@ set (CMAKE_CXX_FLAGS "-DFOLLY_NO_CONFIG=1 -DFOLLY_HAVE_CLOCK_GETTIME=1 -DFOLLY_H
set (PACKAGE_NAME "VisionCamera")
set (BUILD_DIR ${CMAKE_SOURCE_DIR}/build)
-set (RN_SO_DIR ${NODE_MODULES_DIR}/react-native/ReactAndroid/src/main/jni/first-party/react/jni)
+set (RN_SO_DIR ../node_modules/react-native/ReactAndroid/src/main/jni/first-party/react/jni)
# VisionCamera shared
@@ -50,6 +50,7 @@ target_include_directories(
"${NODE_MODULES_DIR}/react-native-reanimated/Common/cpp/headers/Registries"
"${NODE_MODULES_DIR}/react-native-reanimated/Common/cpp/headers/LayoutAnimations"
"${NODE_MODULES_DIR}/react-native-reanimated/Common/cpp/hidden_headers"
+ "${NODE_MODULES_DIR}/react-native-v8/src"
"src/main/cpp"
)
@@ -69,16 +70,16 @@ if(${FOR_HERMES})
# Use Reanimated Hermes
file (GLOB LIBREANIMATED_DIR "${BUILD_DIR}/react-native-reanimated-*-hermes.aar/jni/${ANDROID_ABI}")
else()
- file (GLOB LIBJSC_DIR "${BUILD_DIR}/android-jsc*.aar/jni/${ANDROID_ABI}")
- # Use JSC
+ file (GLOB LIBV8_DIR "${RN_SO_DIR}/${ANDROID_ABI}")
+ # Use v8
find_library(
JS_ENGINE_LIB
- jscexecutor
- PATHS ${LIBRN_DIR}
+ v8executor
+ PATHS ${LIBV8_DIR}
NO_CMAKE_FIND_ROOT_PATH
)
- # Use Reanimated JSC
- file (GLOB LIBREANIMATED_DIR "${BUILD_DIR}/react-native-reanimated-*-jsc.aar/jni/${ANDROID_ABI}")
+ # Use Reanimated v8
+ file (GLOB LIBREANIMATED_DIR "${BUILD_DIR}/react-native-reanimated-*-v8.aar/jni/${ANDROID_ABI}")
endif()
find_library(
@@ -87,12 +88,6 @@ find_library(
PATHS ${LIBRN_DIR}
NO_CMAKE_FIND_ROOT_PATH
)
-find_library(
- JSI_LIB
- jsi
- PATHS ${LIBRN_DIR}
- NO_CMAKE_FIND_ROOT_PATH
-)
find_library(
FOLLY_JSON_LIB
folly_json
@@ -125,8 +120,7 @@ message(WARNING "VisionCamera linking: FOR_HERMES=${FOR_HERMES}")
target_link_libraries(
${PACKAGE_NAME}
${LOG_LIB}
- ${JSI_LIB}
- ${JS_ENGINE_LIB} # <-- Hermes or JSC
+ ${JS_ENGINE_LIB} # <-- Hermes or v8
${REANIMATED_LIB}
${REACT_NATIVE_JNI_LIB}
${FBJNI_LIB}
diff --git a/node_modules/react-native-vision-camera/android/build.gradle b/node_modules/react-native-vision-camera/android/build.gradle
index f3ffea4..6f3e79e 100644
--- a/node_modules/react-native-vision-camera/android/build.gradle
+++ b/node_modules/react-native-vision-camera/android/build.gradle
@@ -131,6 +131,7 @@ android {
configurations {
extractHeaders
extractJNI
+ extractSO
}
}
@@ -216,7 +217,7 @@ dependencies {
//noinspection GradleDynamicVersion
extractJNI("com.facebook.fbjni:fbjni:+")
- def rnAAR = fileTree("${rootDir}/../node_modules/react-native/android").matching({ it.include "**/**/*.aar" }).singleFile
+ def rnAAR = fileTree("${rootDir}/../node_modules/react-native-v8/dist").matching({ it.include "**/**/*.aar" }).singleFile
def jscAAR = fileTree("${rootDir}/../node_modules/jsc-android/dist/org/webkit/android-jsc").matching({ it.include "**/**/*.aar" }).singleFile
def inputFile = new File(rootDir, '../node_modules/react-native/package.json')
@@ -225,9 +226,11 @@ dependencies {
def (major, minor, patch) = reactNativeVersion.tokenize('.')
def jsEngine = FOR_HERMES ? "hermes" : "jsc"
- def reaAAR = "${rootDir}/../node_modules/react-native-reanimated/android/react-native-reanimated-${minor}-${jsEngine}.aar"
+ //def reaAAR = "${rootDir}/../node_modules/react-native-reanimated/android/react-native-reanimated-${minor}-${jsEngine}.aar"
+ def reaAAR = "${rootDir}/../node_modules/react-native-reanimated/android/react-native-reanimated-${minor}-v8.aar"
extractJNI(files(rnAAR, jscAAR, reaAAR))
+ extractSO(files(rnAAR, jscAAR))
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-guava:1.5.2"
@@ -463,12 +466,29 @@ task extractJNIFiles {
extractJNIFiles.mustRunAfter extractAARHeaders
+task extractSOFiles {
+ doLast {
+ configurations.extractSO.files.each {
+ def file = it.absoluteFile
+ def packageName = file.name.tokenize('-')[0]
+ copy {
+ from zipTree(file)
+ into "$reactNative/ReactAndroid/src/main/jni/first-party/$packageName/"
+ include "jni/**/*.so"
+ }
+ }
+ }
+}
+
+extractSOFiles.mustRunAfter extractJNIFiles
+
// pre-native build pipeline
tasks.whenTaskAdded { task ->
if (task.name == 'externalNativeBuildDebug' || task.name == 'externalNativeBuildRelease') {
task.dependsOn(extractAARHeaders)
task.dependsOn(extractJNIFiles)
+ task.dependsOn(extractSOFiles)
task.dependsOn(prepareJSC)
task.dependsOn(prepareHermes)
task.dependsOn(prepareThirdPartyNdkHeaders)
diff --git a/node_modules/react-native-vision-camera/android/src/main/cpp/MakeJSIRuntime.h b/node_modules/react-native-vision-camera/android/src/main/cpp/MakeJSIRuntime.h
index 39045bd..905f8b4 100644
--- a/node_modules/react-native-vision-camera/android/src/main/cpp/MakeJSIRuntime.h
+++ b/node_modules/react-native-vision-camera/android/src/main/cpp/MakeJSIRuntime.h
@@ -11,8 +11,8 @@
// Hermes
#include <hermes/hermes.h>
#else
- // JSC
- #include <jsi/JSCRuntime.h>
+ // v8
+ #include <v8runtime/V8RuntimeFactory.h>
#endif
namespace vision {
@@ -23,7 +23,7 @@ static std::unique_ptr<jsi::Runtime> makeJSIRuntime() {
#if FOR_HERMES
return facebook::hermes::makeHermesRuntime();
#else
- return facebook::jsc::makeJSCRuntime();
+ return facebook::createV8Runtime("");
#endif
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment