dynamsoft-capture-vision-react-native 2.6.1016 → 3.0.5100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/LICENSE +2 -2
  2. package/README.md +7 -9
  3. package/android/build.gradle +73 -42
  4. package/android/src/main/cpp/CMakeLists.txt +22 -0
  5. package/android/src/main/cpp/ImgHO.cpp +95 -0
  6. package/android/src/main/cpp/ImgHO.h +34 -0
  7. package/android/src/main/cpp/JsiCore.cpp +284 -0
  8. package/android/src/main/cpp/JsiCore.h +51 -0
  9. package/android/src/main/cpp/JsiCvr.cpp +327 -0
  10. package/android/src/main/cpp/JsiCvr.h +54 -0
  11. package/android/src/main/cpp/JsiDbr.cpp +38 -0
  12. package/android/src/main/cpp/JsiDbr.h +26 -0
  13. package/android/src/main/cpp/JsiDce.cpp +59 -0
  14. package/android/src/main/cpp/JsiDce.h +17 -0
  15. package/android/src/main/cpp/JsiDcp.cpp +51 -0
  16. package/android/src/main/cpp/JsiDcp.h +31 -0
  17. package/android/src/main/cpp/JsiDdn.cpp +50 -0
  18. package/android/src/main/cpp/JsiDdn.h +28 -0
  19. package/android/src/main/cpp/JsiDlr.cpp +51 -0
  20. package/android/src/main/cpp/JsiDlr.h +26 -0
  21. package/android/src/main/cpp/JsiUtility.cpp +196 -0
  22. package/android/src/main/cpp/JsiUtility.h +16 -0
  23. package/android/src/main/cpp/RawBuffer.cpp +24 -0
  24. package/android/src/main/cpp/RawBuffer.h +24 -0
  25. package/android/src/main/cpp/android_log.h +14 -0
  26. package/android/src/main/dysJniLibs/debug/arm64-v8a/librn_dys.so +0 -0
  27. package/android/src/main/dysJniLibs/debug/armeabi-v7a/librn_dys.so +0 -0
  28. package/android/src/main/dysJniLibs/debug/x86/librn_dys.so +0 -0
  29. package/android/src/main/dysJniLibs/debug/x86_64/librn_dys.so +0 -0
  30. package/android/src/main/dysJniLibs/release/arm64-v8a/librn_dys.so +0 -0
  31. package/android/src/main/dysJniLibs/release/armeabi-v7a/librn_dys.so +0 -0
  32. package/android/src/main/dysJniLibs/release/x86/librn_dys.so +0 -0
  33. package/android/src/main/dysJniLibs/release/x86_64/librn_dys.so +0 -0
  34. package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/CVRModule.kt +4 -4
  35. package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/DCEModule.kt +10 -0
  36. package/android/src/main/java/com/dynamsoft/reactnativelib/ReactNativeDcvPackage.kt +13 -85
  37. package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/VersionsModule.kt +2 -2
  38. package/android/src/main/java/com/dynamsoft/reactnativelib/cvr/CaptureVisionRouterModuleImpl.kt +25 -25
  39. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraEnhancerModuleImpl.kt +23 -2
  40. package/android/src/main/java/com/dynamsoft/reactnativelib/license/LicenseModuleImpl.kt +1 -1
  41. package/android/src/main/java/com/dynamsoft/reactnativelib/utility/ImageManagerModuleImpl.kt +19 -4
  42. package/android/src/main/java/com/dynamsoft/reactnativelib/utils/ForCore.kt +14 -0
  43. package/android/src/main/java/com/dynamsoft/reactnativelib/utils/ForCvr.kt +12 -7
  44. package/android/src/main/java/com/dynamsoft/reactnativelib/utils/ForDBR.kt +1 -7
  45. package/android/src/main/java/com/dynamsoft/reactnativelib/utils/ForDCE.kt +2 -2
  46. package/android/src/main/java/com/dynamsoft/reactnativelib/utils/ForDDN.kt +27 -19
  47. package/dynamsoft-capture-vision-react-native.podspec +9 -7
  48. package/ios/CPP/DSImageData+HostObject.h +1 -1
  49. package/ios/CPP/RNDynamsoft+JSI.h +2 -2
  50. package/ios/CPP/RNDynamsoft+JSI.mm +18 -10
  51. package/ios/CPP/RNDynamsoft+Json.h +2 -13
  52. package/ios/CPP/RNDynamsoft+Json.m +48 -39
  53. package/ios/CPP/YeetJSIUtils.h +3 -1
  54. package/ios/CPP/YeetJSIUtils.mm +5 -0
  55. package/ios/RNDynamsoftCameraView.m +1 -1
  56. package/ios/RNDynamsoftCameraViewManager.m +23 -8
  57. package/ios/RNDynamsoftCaptureVisionRouter.mm +76 -45
  58. package/ios/RNDynamsoftImageEditorView.m +1 -1
  59. package/ios/RNDynamsoftImageEditorViewManager.mm +36 -13
  60. package/ios/RNDynamsoftImageManager.mm +33 -4
  61. package/ios/RNDynamsoftImageSourceAdapter.mm +1 -1
  62. package/ios/RNDynamsoftLicense.m +1 -1
  63. package/ios/RNDynamsoftMultiCrossFilter.m +9 -9
  64. package/ios/RNDynamsoftVersions.m +1 -13
  65. package/package.json +3 -11
  66. package/src/core/CapturedResultBase.tsx +18 -0
  67. package/src/core/EnumCaptureResultItemType.tsx +12 -6
  68. package/src/core/EnumCrossVerificationStatus.tsx +6 -6
  69. package/src/core/ImageData.tsx +1 -1
  70. package/src/core/index.tsx +1 -0
  71. package/src/cvr/CaptureVisionRouter.tsx +47 -51
  72. package/src/cvr/CapturedResult.tsx +24 -46
  73. package/src/cvr/CapturedResultReceiver.tsx +12 -19
  74. package/src/cvr/NativeDynamsoftCaptureVisionRouterModule.tsx +2 -2
  75. package/src/cvr/SimplifiedCaptureVisionSettings.tsx +4 -4
  76. package/src/dbr/DecodedBarcodesResult.tsx +3 -17
  77. package/src/dce/CameraEnhancer.tsx +9 -0
  78. package/src/dce/DynamsoftCameraViewNativeComponent.ts +2 -2
  79. package/src/dce/EnumResolution.tsx +7 -0
  80. package/src/dce/NativeDynamsoftCameraViewModule.tsx +4 -0
  81. package/src/dce/index.tsx +1 -0
  82. package/src/dcp/ParsedResult.tsx +3 -14
  83. package/src/ddn/DeskewedImageResultItem.tsx +40 -0
  84. package/src/ddn/DetectedQuadResultItem.tsx +3 -1
  85. package/src/ddn/EnhancedImageResultItem.tsx +20 -0
  86. package/src/ddn/ProcessedDocumentResult.tsx +27 -0
  87. package/src/ddn/SimplifiedDocumentNormalizerSettings.tsx +18 -3
  88. package/src/ddn/index.tsx +3 -3
  89. package/src/dlr/RecognizedTextLinesResult.tsx +2 -16
  90. package/src/index.tsx +0 -1
  91. package/src/utility/ImageManager.tsx +66 -45
  92. package/android/src/main/java/com/dynamsoft/reactnativelib/rtu/BarcodeScannerModuleImpl.kt +0 -80
  93. package/android/src/main/java/com/dynamsoft/reactnativelib/rtu/MRZScannerModuleImpl.kt +0 -77
  94. package/android/src/main/java/com/dynamsoft/reactnativelib/rtu/ScannerInterface.kt +0 -47
  95. package/android/src/main/jniLibs/arm64-v8a/librn_dys.so +0 -0
  96. package/android/src/main/jniLibs/armeabi-v7a/librn_dys.so +0 -0
  97. package/android/src/main/jniLibs/x86/librn_dys.so +0 -0
  98. package/android/src/main/jniLibs/x86_64/librn_dys.so +0 -0
  99. package/android/src/newarch/com/dynamsoft/reactnativelib/BarcodeScannerModule.kt +0 -22
  100. package/android/src/newarch/com/dynamsoft/reactnativelib/CVRModule.kt +0 -91
  101. package/android/src/newarch/com/dynamsoft/reactnativelib/CameraViewManager.kt +0 -52
  102. package/android/src/newarch/com/dynamsoft/reactnativelib/DCEModule.kt +0 -91
  103. package/android/src/newarch/com/dynamsoft/reactnativelib/ISAModule.kt +0 -60
  104. package/android/src/newarch/com/dynamsoft/reactnativelib/ImageEditorViewManager.kt +0 -16
  105. package/android/src/newarch/com/dynamsoft/reactnativelib/ImageEditorViewModule.kt +0 -24
  106. package/android/src/newarch/com/dynamsoft/reactnativelib/ImageManagerModule.kt +0 -12
  107. package/android/src/newarch/com/dynamsoft/reactnativelib/LicenseModule.kt +0 -14
  108. package/android/src/newarch/com/dynamsoft/reactnativelib/MRZScannerModule.kt +0 -22
  109. package/android/src/newarch/com/dynamsoft/reactnativelib/MultiCrossFilterModule.kt +0 -58
  110. package/android/src/newarch/com/dynamsoft/reactnativelib/VersionsModule.kt +0 -41
  111. package/android/src/oldarch/com/dynamsoft/reactnativelib/BarcodeScannerModule.kt +0 -24
  112. package/android/src/oldarch/com/dynamsoft/reactnativelib/MRZScannerModule.kt +0 -24
  113. package/ios/RNDynamsoftBarcodeScanner.h +0 -14
  114. package/ios/RNDynamsoftBarcodeScanner.m +0 -169
  115. package/ios/RNDynamsoftMRZScanner.h +0 -14
  116. package/ios/RNDynamsoftMRZScanner.m +0 -140
  117. package/src/ddn/DetectedQuadsResult.tsx +0 -31
  118. package/src/ddn/NormalizedImageResultItem.tsx +0 -32
  119. package/src/ddn/NormalizedImagesResult.tsx +0 -27
  120. package/src/rtu/BarcodeScanConfig.tsx +0 -104
  121. package/src/rtu/BarcodeScanResult.tsx +0 -31
  122. package/src/rtu/BarcodeScanner.tsx +0 -112
  123. package/src/rtu/EnumResultState.tsx +0 -21
  124. package/src/rtu/MRZScanConfig.tsx +0 -67
  125. package/src/rtu/MRZScanResult.tsx +0 -84
  126. package/src/rtu/MRZScanner.tsx +0 -90
  127. package/src/rtu/NativeDynamsoftBarcodeScannerModule.tsx +0 -6
  128. package/src/rtu/NativeDynamsoftMRZScannerModule.tsx +0 -6
  129. package/src/rtu/index.tsx +0 -7
  130. /package/android/src/main/{withNamespace/AndroidManifest.xml → AndroidManifest.xml} +0 -0
  131. /package/android/src/main/{withoutNamespace/AndroidManifest.xml → AndroidManifest_noPackage.xml} +0 -0
  132. /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/CameraViewManager.kt +0 -0
  133. /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/ISAModule.kt +0 -0
  134. /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/ImageEditorViewManager.kt +0 -0
  135. /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/ImageEditorViewModule.kt +0 -0
  136. /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/ImageManagerModule.kt +0 -0
  137. /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/LicenseModule.kt +0 -0
  138. /package/android/src/{oldarch → main/java}/com/dynamsoft/reactnativelib/MultiCrossFilterModule.kt +0 -0
package/LICENSE CHANGED
@@ -1,5 +1,5 @@
1
1
  License Notice
2
2
 
3
- The source code of the Dynamsoft Capture Vision (DCV) React Native Edition published here is released under the Apache 2.0 license: http://www.apache.org/licenses/LICENSE-2.0. Dynamsoft Barcode Reader (DBR) and Dynamsoft Camera Enhancer (DCE) SDK upon which Dynamsoft Capture Vision (DCV) depends are provided under a commercial license from https://www.dynamsoft.com/company/license-agreement/. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4
-
3
+ The source code of the Dynamsoft Capture Vision (DCV) React Native Edition published here is released under the Apache 2.0 license: http://www.apache.org/licenses/LICENSE-2.0. Dynamsoft Barcode Reader (DBR), Dynamsoft Label Recognizer (DLR), Dynamsoft Document Normalizer (DDN), Dynamsoft Code Parser (DCP) and Dynamsoft Camera Enhancer (DCE) SDK upon which Dynamsoft Capture Vision (DCV) React Native Edition depends are provided under a commercial license from https://www.dynamsoft.com/company/license-agreement/. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4
+
5
5
  Copyright © 2003–2025 Dynamsoft. All Rights Reserved.
package/README.md CHANGED
@@ -32,7 +32,7 @@ DCV enables you to develop highly customizable applications for barcode reading,
32
32
 
33
33
  ### iOS
34
34
 
35
- - Supported OS: iOS 11+ (iOS 13+ recommended).
35
+ - Supported OS: iOS 13+.
36
36
  - Supported ABI: arm64 and x86_64.
37
37
  - Development Environment: Xcode 13+ (Xcode 14.1+ recommended).
38
38
 
@@ -41,20 +41,18 @@ DCV enables you to develop highly customizable applications for barcode reading,
41
41
  - Node: 18 or higher
42
42
 
43
43
  ## User Guide
44
- - [Foundation Barcode Reader Integration Guide](https://github.com/Dynamsoft/capture-vision-react-native-samples/blob/main/foundation-barcode-reader-guide.md)
45
- - [Ready-to-use Barcode Scanner Integration Guide](https://github.com/Dynamsoft/capture-vision-react-native-samples/blob/main/ready-to-use-barcode-scanner-guide.md)
46
- - [Document Scanner Integration Guide](https://github.com/Dynamsoft/capture-vision-react-native-samples/blob/main/document-scanner-guide.md)
47
- - [MRZ Scanner Integration Guide](https://github.com/Dynamsoft/capture-vision-react-native-samples/blob/main/mrz-scanner-guide.md)
48
- - [Divers' License Scanner Integration Guide](https://github.com/Dynamsoft/capture-vision-react-native-samples/blob/main/drivers-license-scanner-guide.md)
44
+
45
+ - [MRZ Scanner Integration Guide](https://github.com/Dynamsoft/capture-vision-react-native-samples/blob/main/guide-scan-mrz.md)
46
+ - [Document Scanner Integration Guide](https://github.com/Dynamsoft/capture-vision-react-native-samples/blob/main/guide-scan-document.md)
47
+ - [VIN Scanner Integration Guide](https://github.com/Dynamsoft/capture-vision-react-native-samples/blob/main/guide-scan-vin.md)
49
48
 
50
49
  ## Samples
51
50
 
52
51
  You can view all the DCV React Native samples via the following links:
53
52
 
54
- - [ScanBarcodes](https://github.com/Dynamsoft/capture-vision-react-native-samples/tree/main/ScanBarcodes)
55
- - [DetectAndDeskewDocument](https://github.com/Dynamsoft/capture-vision-react-native-samples/tree/main/DetectAndDeskewDocument)
56
53
  - [ScanMRZ](https://github.com/Dynamsoft/capture-vision-react-native-samples/tree/main/ScanMRZ)
57
- - [ReadDriverLicense](https://github.com/Dynamsoft/capture-vision-react-native-samples/tree/main/ReadDriverLicense)
54
+ - [ScanDocument](https://github.com/Dynamsoft/capture-vision-react-native-samples/tree/main/ScanDocument)
55
+ - [ScanVIN](https://github.com/Dynamsoft/capture-vision-react-native-samples/tree/main/ScanVIN)
58
56
 
59
57
  ## License
60
58
 
@@ -8,10 +8,7 @@ def safeExtGet(prop, fallback) {
8
8
 
9
9
  apply plugin: 'com.android.library'
10
10
  apply plugin: "kotlin-android"
11
- def isNewArchitectureEnabled = rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true"
12
- if (isNewArchitectureEnabled) {
13
- apply plugin: "com.facebook.react"
14
- }
11
+
15
12
  buildscript {
16
13
  def kotlinVersion = rootProject.ext.has("kotlinVersion") ? rootProject.ext.get("kotlinVersion") : project.properties["kotlinVersion"]
17
14
  repositories {
@@ -24,32 +21,43 @@ buildscript {
24
21
  }
25
22
  }
26
23
 
27
- def resolveBuildType() {
28
- Gradle gradle = getGradle()
29
- String tskReqStr = gradle.getStartParameter().getTaskRequests()['args'].toString()
30
-
31
- return tskReqStr.contains('Release') ? 'release' : 'debug'
32
- }
33
-
34
- def supportsNamespace() {
24
+ static def supportsNamespace() {
35
25
  def parsed = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')
36
26
  def major = parsed[0].toInteger()
37
27
  def minor = parsed[1].toInteger()
38
-
39
- // Namespace support was added in 7.3.0
40
28
  return (major == 7 && minor >= 3) || major >= 8
41
29
  }
42
30
 
31
+
32
+ def getReactNativeVersion() {
33
+ def packageJsonFile = file("$rootDir/../node_modules/react-native/package.json")
34
+ if (packageJsonFile.exists()) {
35
+ def packageJson = new groovy.json.JsonSlurper().parseText(packageJsonFile.text)
36
+ return packageJson.version
37
+ }
38
+ return "unknown"
39
+ }
40
+
41
+ static def getMajor(String version) {
42
+ def parts = version.tokenize('.')
43
+ return parts.size() > 0 ? parts[0].toInteger() : 0
44
+ }
45
+
46
+ static def getMinor(String version) {
47
+ def parts = version.tokenize('.')
48
+ return parts.size() > 1 ? parts[1].toInteger() : 0
49
+ }
50
+
43
51
  android {
52
+ def reactNativeVersion = getReactNativeVersion()
53
+ def versionNumber = getMajor(reactNativeVersion) * 100 + getMinor(reactNativeVersion)
54
+
44
55
  if (supportsNamespace()) {
45
56
  namespace "com.dynamsoft.reactnativelib"
46
- }
47
- sourceSets {
48
- main {
49
- manifest.srcFile supportsNamespace()?
50
- "src/main/withoutNamespace/AndroidManifest.xml":
51
- "src/main/withNamespace/AndroidManifest.xml"
52
- java.srcDirs += isNewArchitectureEnabled? ["src/newarch"] : ["src/oldarch"]
57
+ sourceSets {
58
+ main {
59
+ manifest.srcFile "src/main/AndroidManifest_noPackage.xml"
60
+ }
53
61
  }
54
62
  }
55
63
 
@@ -59,17 +67,48 @@ android {
59
67
  targetSdkVersion safeExtGet('targetSdkVersion', DEFAULT_TARGET_SDK_VERSION)
60
68
  versionCode 1
61
69
  versionName "1.0"
62
- // externalNativeBuild {
63
- // cmake {
64
- // cppFlags "-O2 -frtti -fexceptions -Wall -Wno-unused-variable -fstack-protector-all"
65
- // arguments "-DANDROID_STL=c++_shared"
66
- // }
67
- // }
68
- buildConfigField("boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled.toString())
70
+
71
+ if(versionNumber < 79) {
72
+ externalNativeBuild {
73
+ cmake {
74
+ arguments "-DANDROID_STL=c++_shared"
75
+ }
76
+ }
77
+ }
69
78
  }
70
79
  lintOptions {
71
80
  abortOnError false
72
81
  }
82
+
83
+ if(versionNumber < 79) {
84
+ buildFeatures {
85
+ prefab true
86
+ buildConfig true
87
+ }
88
+ externalNativeBuild {
89
+ cmake {
90
+ path "src/main/cpp/CMakeLists.txt"
91
+ }
92
+ }
93
+ } else {
94
+ buildTypes {
95
+ release {
96
+ sourceSets {
97
+ main {
98
+ jniLibs.srcDirs = ["src/main/dysJniLibs/release"]
99
+ }
100
+ }
101
+ }
102
+ debug {
103
+ sourceSets {
104
+ main {
105
+ jniLibs.srcDirs = ["src/main/dysJniLibs/debug"]
106
+ }
107
+ }
108
+ }
109
+ }
110
+ }
111
+
73
112
  }
74
113
 
75
114
  repositories {
@@ -91,8 +130,13 @@ rootProject.allprojects {
91
130
  url "https://download2.dynamsoft.com/maven/aar"
92
131
  }
93
132
  }
133
+
134
+ configurations.all {
135
+ resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
136
+ }
94
137
  }
95
138
 
139
+
96
140
  dependencies {
97
141
  def kotlinVersion = rootProject.ext.has("kotlinVersion") ? rootProject.ext.get("kotlinVersion") : project.properties["kotlinVersion"]
98
142
 
@@ -105,18 +149,5 @@ dependencies {
105
149
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
106
150
  implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3"
107
151
 
108
- implementation("com.dynamsoft:dynamsoftcapturevisionbundle:2.6.1003") {
109
- exclude(group: "com.dynamsoft", module: "dynamsoftcameraenhancer")
110
- }
111
-
112
- implementation "com.dynamsoft:mrzscannerbundle:2.0.1@aar"
113
-
114
- implementation "com.dynamsoft:dynamsoftbarcodereaderbundle:10.4.3003-beta1@aar"
115
- implementation "com.dynamsoft:dynamsoftcameraenhancer:4.2.23-beta2@aar"
116
-
117
- def camerax_version = '1.4.0'
118
- api "androidx.camera:camera-core:$camerax_version"
119
- api "androidx.camera:camera-camera2:$camerax_version"
120
- api "androidx.camera:camera-lifecycle:$camerax_version"
121
- api "androidx.camera:camera-view:$camerax_version"
152
+ implementation "com.dynamsoft:capturevisionbundle:3.0.5000"
122
153
  }
@@ -0,0 +1,22 @@
1
+ cmake_minimum_required(VERSION 3.22.1)
2
+
3
+ project("rn_dys")
4
+
5
+ file(GLOB SRC_FILES "*.cpp")
6
+
7
+ add_library(${CMAKE_PROJECT_NAME} SHARED
8
+ ${SRC_FILES})
9
+
10
+ find_package(ReactAndroid REQUIRED CONFIG)
11
+
12
+ target_link_libraries(${CMAKE_PROJECT_NAME}
13
+ ReactAndroid::jsi # <-- RN: JSI
14
+ android
15
+ log)
16
+
17
+ target_link_options(${CMAKE_PROJECT_NAME} PRIVATE
18
+ "-Wl,-z,max-page-size=16384"
19
+ "-Wl,--gc-sections"
20
+ "-Wl,--strip-all"
21
+ "-s"
22
+ )
@@ -0,0 +1,95 @@
1
+ //
2
+ // Created by Allen on 24/08/26.
3
+ //
4
+
5
+ #include "ImgHO.h"
6
+ #include "RawBuffer.h"
7
+ #include "android_log.h"
8
+
9
+ #define JSI_FUNC [=](Runtime & runtime, const Value& thisValue, const Value* arguments, size_t count) -> Value
10
+ #define GET_VALUE(X) if(name==#X){return this->X;}
11
+ #define SET_INT_VALUE(X) if(name==#X){this->X = (int) value.asNumber();}
12
+
13
+ ImageDataHostObject::ImageDataHostObject(int width, int height, int stride, int format, int orientation, uint8_t *buffer, int bufferSize)
14
+ : width(width), height(height), stride(stride), format(format), orientation(orientation), buffer(buffer), bufferSize(bufferSize) {
15
+ }
16
+
17
+ ImageDataHostObject ImageDataHostObject::getHOFromObject(Runtime &runtime, Object jsObj) {
18
+ if (jsObj.isHostObject(runtime)) {
19
+ return *((ImageDataHostObject *) (jsObj.asHostObject(runtime).get()));
20
+ }
21
+ ImageDataHostObject imageHO;
22
+ int width = jsObj.hasProperty(runtime, "width") ? (int) jsObj.getProperty(runtime, "width").asNumber() : 0;
23
+ int height = jsObj.hasProperty(runtime, "height") ? (int) jsObj.getProperty(runtime, "height").asNumber() : 0;
24
+ int stride = jsObj.hasProperty(runtime, "stride") ? (int) jsObj.getProperty(runtime, "stride").asNumber() : 0;
25
+ int format = jsObj.hasProperty(runtime, "format") ? (int) jsObj.getProperty(runtime, "format").asNumber() : 0;
26
+ int orientation = jsObj.hasProperty(runtime, "orientation") ? (int) jsObj.getProperty(runtime, "orientation").asNumber() : 0;
27
+ uint8_t *buffer = nullptr;
28
+ int bufferSize = 0;
29
+ if (jsObj.hasProperty(runtime, "buffer")) {
30
+ ArrayBuffer array_buffer = jsObj.getProperty(runtime, "buffer").asObject(runtime).getArrayBuffer(runtime);
31
+ buffer = array_buffer.data(runtime);
32
+ bufferSize = (int) array_buffer.length(runtime);
33
+ }
34
+ return ImageDataHostObject(width, height, stride, format, orientation, buffer, bufferSize);
35
+ }
36
+
37
+ Value ImageDataHostObject::get(Runtime &runtime, const PropNameID &propName) {
38
+ auto name = propName.utf8(runtime);
39
+ GET_VALUE(width)
40
+ GET_VALUE(height)
41
+ GET_VALUE(stride)
42
+ GET_VALUE(format)
43
+ GET_VALUE(orientation)
44
+ GET_VALUE(bufferSize)
45
+ //todo
46
+ if (name == "buffer") {
47
+ auto mutableBuffer = std::make_shared<MutableRawBuffer>(buffer, bufferSize, false);
48
+ return ArrayBuffer(runtime, mutableBuffer);
49
+ }
50
+
51
+ if (name == "release") {
52
+ auto release = JSI_FUNC {
53
+ if(buffer != nullptr) {
54
+ delete[] buffer;
55
+ buffer = nullptr;
56
+ bufferSize = 0;
57
+ }
58
+ return {};
59
+ };
60
+ return Function::createFromHostFunction(runtime, PropNameID::forUtf8(runtime, "release"), 0, release);
61
+ }
62
+ return {};
63
+ }
64
+
65
+ void ImageDataHostObject::set(Runtime &runtime, const PropNameID &propName, const Value &value) {
66
+ auto name = propName.utf8(runtime);
67
+ SET_INT_VALUE(width)
68
+ SET_INT_VALUE(height)
69
+ SET_INT_VALUE(stride)
70
+ SET_INT_VALUE(format)
71
+ SET_INT_VALUE(orientation)
72
+ //todo
73
+ if (name == "buffer") {
74
+ auto arrayBuffer = value.asObject(runtime).getArrayBuffer(runtime);
75
+ this->buffer = arrayBuffer.data(runtime);
76
+ this->bufferSize = (int) arrayBuffer.length(runtime);
77
+ }
78
+ }
79
+
80
+ std::vector<PropNameID> ImageDataHostObject::getPropertyNames(Runtime &rt) {
81
+ std::vector<PropNameID> result;
82
+ result.push_back(PropNameID::forUtf8(rt, std::string("width")));
83
+ result.push_back(PropNameID::forUtf8(rt, std::string("height")));
84
+ result.push_back(PropNameID::forUtf8(rt, std::string("stride")));
85
+ result.push_back(PropNameID::forUtf8(rt, std::string("format")));
86
+ result.push_back(PropNameID::forUtf8(rt, std::string("orientation")));
87
+ result.push_back(PropNameID::forUtf8(rt, std::string("buffer")));
88
+ result.push_back(PropNameID::forUtf8(rt, std::string("release")));
89
+ return result;
90
+ }
91
+
92
+ void ImageDataHostObject::logString(const char *preStr) const {
93
+ LOGI("%s wid:%d, hgt:%d, stride:%d, format:%d, orientation:%d, bufferSize:%d, buffer:%p, this:%p",
94
+ preStr, width, height, stride, format, orientation, bufferSize, buffer, this);
95
+ }
@@ -0,0 +1,34 @@
1
+ //
2
+ // Created by Allen on 24/08/26.
3
+ //
4
+
5
+ #ifndef REACT_NATIVE_DCV_ANDROID_SRC_MAIN_CPP_CORE_IMAGEDATAHOSTOBJECT_H_
6
+ #define REACT_NATIVE_DCV_ANDROID_SRC_MAIN_CPP_CORE_IMAGEDATAHOSTOBJECT_H_
7
+
8
+ #include "jsi/jsi.h"
9
+
10
+ using namespace facebook::jsi;
11
+
12
+ class ImageDataHostObject : public HostObject {
13
+ public:
14
+ int width = 0;
15
+ int height = 0;
16
+ int stride = 0;
17
+ int format = 0;
18
+ int orientation = 0;
19
+
20
+ uint8_t *buffer = nullptr;
21
+ int bufferSize = 0;
22
+
23
+ explicit ImageDataHostObject() = default;
24
+ explicit ImageDataHostObject(int width, int height, int stride, int format, int orientation, uint8_t *buffer, int bufferSize);
25
+
26
+ Value get(Runtime &, const PropNameID &name) override;
27
+ void set(Runtime &, const PropNameID &name, const Value &value) override;
28
+ std::vector<PropNameID> getPropertyNames(Runtime &rt) override;
29
+
30
+ static ImageDataHostObject getHOFromObject(Runtime &runtime, Object jsObj);
31
+ void logString(const char *preStr = "ImageDataHostObject") const;
32
+ };
33
+
34
+ #endif //REACT_NATIVE_DCV_ANDROID_SRC_MAIN_CPP_CORE_IMAGEDATAHOSTOBJECT_H_
@@ -0,0 +1,284 @@
1
+ //
2
+ // Created by Allen on 24/08/26.
3
+ //
4
+
5
+ #include "JsiCore.h"
6
+
7
+ JavaVM *gJvm = nullptr;
8
+
9
+ jint JNI_OnLoad(JavaVM *vm, void *reserved) {
10
+ gJvm = vm;
11
+ JNIEnv *env = nullptr;
12
+ if (vm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) {
13
+ return -1;
14
+ }
15
+ return JNI_VERSION_1_6;
16
+ }
17
+
18
+ namespace jsiConversion::core {
19
+
20
+ void jPointToJsObject(Runtime &rt, JNIEnv *env, jobject jPoint, Object &jsPoint) {
21
+ if (!jPoint) {
22
+ return;
23
+ }
24
+ jclass jclsPoint = env->FindClass("android/graphics/Point");
25
+ jfieldID x = env->GetFieldID(jclsPoint, "x", "I");
26
+ jfieldID y = env->GetFieldID(jclsPoint, "y", "I");
27
+ jsPoint.setProperty(rt, "x", env->GetIntField(jPoint, x));
28
+ jsPoint.setProperty(rt, "y", env->GetIntField(jPoint, y));
29
+ env->DeleteLocalRef(jclsPoint);
30
+ }
31
+
32
+ void jQuadToJsObject(Runtime &rt, JNIEnv *env, jobject jQuad, Object &jsQuad) {
33
+ if (!jQuad) {
34
+ return;
35
+ }
36
+ jclass jclsQuad = env->FindClass("com/dynamsoft/core/basic_structures/Quadrilateral");
37
+ jfieldID points = env->GetFieldID(jclsQuad, "points", "[Landroid/graphics/Point;");
38
+ auto jPoints = (jobjectArray) env->GetObjectField(jQuad, points);
39
+ if (!jPoints) {
40
+ jsQuad.setProperty(rt, "points", Value::undefined());
41
+ }
42
+ int count = env->GetArrayLength(jPoints);
43
+ Array pointArr(rt, count);
44
+ for (int i = 0; i < count; ++i) {
45
+ Object jsPoint(rt);
46
+ jobject jPoint = env->GetObjectArrayElement(jPoints, i);
47
+ jPointToJsObject(rt, env, jPoint, jsPoint);
48
+ pointArr.setValueAtIndex(rt, i, std::move(jsPoint));
49
+ env->DeleteLocalRef(jPoint);
50
+ }
51
+ jsQuad.setProperty(rt, "points", std::move(pointArr));
52
+ env->DeleteLocalRef(jclsQuad);
53
+ }
54
+
55
+ void jCapturedItemToJsObject(Runtime &rt, JNIEnv *env, jobject jItem, int &outType, Object &jsItem) {
56
+ if (jItem == nullptr) {
57
+ return;
58
+ }
59
+ jclass clsCapturedResultItem = env->FindClass("com/dynamsoft/core/basic_structures/CapturedResultItem");
60
+ jmethodID getType = env->GetMethodID(clsCapturedResultItem, "getType", "()I");
61
+ jmethodID getTaskName = env->GetMethodID(clsCapturedResultItem, "getTaskName", "()Ljava/lang/String;");
62
+ jmethodID getTargetROIDefName = env->GetMethodID(clsCapturedResultItem, "getTargetROIDefName", "()Ljava/lang/String;");
63
+
64
+ outType = env->CallIntMethod(jItem, getType);
65
+ jsItem.setProperty(rt, "type", outType);
66
+ auto jTaskName = (jstring) env->CallObjectMethod(jItem, getTaskName);
67
+ auto jTargetROIDefName = (jstring) env->CallObjectMethod(jItem, getTargetROIDefName);
68
+ auto pTaskName = jTaskName ? env->GetStringUTFChars(jTaskName, nullptr) : "";
69
+ auto pTargetROIDefName = jTargetROIDefName ? env->GetStringUTFChars(jTargetROIDefName, nullptr) : "";
70
+ jsItem.setProperty(rt, "taskName", pTaskName);
71
+ jsItem.setProperty(rt, "targetROIDefName", pTargetROIDefName);
72
+ if (jTaskName) {
73
+ env->ReleaseStringUTFChars(jTaskName, pTaskName);
74
+ env->ReleaseStringUTFChars(jTargetROIDefName, pTargetROIDefName);
75
+ }
76
+ env->DeleteLocalRef(clsCapturedResultItem);
77
+
78
+ }
79
+
80
+ void jCapturedItemArrayToJsArray(Runtime &rt, JNIEnv *env, jobjectArray jItemArray, int *&outTypes, Array &jsItemArray) {
81
+ if (jItemArray == nullptr) {
82
+ return;
83
+ }
84
+ int count = env->GetArrayLength(jItemArray);
85
+ if (jsItemArray.size(rt) != count) {
86
+ jsItemArray = Array(rt, count);
87
+ }
88
+ outTypes = new int[count];
89
+ int outType = 0;
90
+ for (int i = 0; i < count; ++i) {
91
+ Object jsItem = Object(rt);
92
+ jobject jItem = env->GetObjectArrayElement(jItemArray, i);
93
+ jCapturedItemToJsObject(rt, env, jItem, outType, jsItem);
94
+ outTypes[i] = outType;
95
+ jsItemArray.setValueAtIndex(rt, i, std::move(jsItem));
96
+ env->DeleteLocalRef(jItem);
97
+ }
98
+ }
99
+
100
+ jobject getJImageDataFromHO(JNIEnv *env, const ImageDataHostObject &imageDataHO) {
101
+ jbyteArray jByteArr = nullptr;
102
+ if (imageDataHO.buffer != nullptr) {
103
+ jByteArr = env->NewByteArray((int) imageDataHO.bufferSize);
104
+ env->SetByteArrayRegion(jByteArr, 0, (int) imageDataHO.bufferSize, (jbyte *) imageDataHO.buffer);
105
+ }
106
+ env->PushLocalFrame(4);
107
+ jclass jclsImageData = env->FindClass("com/dynamsoft/core/basic_structures/ImageData");
108
+ jmethodID initImageData = env->GetMethodID(jclsImageData, "<init>", "([BIIIIILcom/dynamsoft/core/basic_structures/ImageTag;)V");
109
+ return env->PopLocalFrame(
110
+ env->NewObject(jclsImageData, initImageData,
111
+ jByteArr, imageDataHO.width, imageDataHO.height, imageDataHO.stride,
112
+ imageDataHO.format, imageDataHO.orientation, (jobject)nullptr)
113
+ );
114
+ }
115
+
116
+ void getHOFromJImageData(JNIEnv *env, jobject jImageData, ImageDataHostObject &imageHO) {
117
+ if (jImageData == nullptr) {
118
+ return;
119
+ }
120
+ env->PushLocalFrame(8);
121
+ jclass jclsImageData = env->FindClass("com/dynamsoft/core/basic_structures/ImageData");
122
+ jfieldID bytes = env->GetFieldID(jclsImageData, "bytes", "[B");
123
+ jfieldID width = env->GetFieldID(jclsImageData, "width", "I");
124
+ jfieldID height = env->GetFieldID(jclsImageData, "height", "I");
125
+ jfieldID stride = env->GetFieldID(jclsImageData, "stride", "I");
126
+ jfieldID orientation = env->GetFieldID(jclsImageData, "orientation", "I");
127
+ jfieldID format = env->GetFieldID(jclsImageData, "format", "I");
128
+
129
+ auto jbytes = (jbyteArray) env->GetObjectField(jImageData, bytes);
130
+ int bytesLength = 0;
131
+ if (jbytes != nullptr) {
132
+ bytesLength = env->GetArrayLength(jbytes);
133
+
134
+ //Don't delete this buffer.
135
+ //Put the responsibility of release to the user(Js-End).
136
+ imageHO.buffer = (uint8_t *)malloc(bytesLength * sizeof(uint8_t));
137
+ env->GetByteArrayRegion(jbytes, 0, bytesLength, (jbyte*)imageHO.buffer);
138
+ }
139
+ imageHO.bufferSize = bytesLength;
140
+ imageHO.width = (int) env->GetIntField(jImageData, width);
141
+ imageHO.height = (int) env->GetIntField(jImageData, height);
142
+ imageHO.stride = (int) env->GetIntField(jImageData, stride);
143
+ imageHO.format = (int) env->GetIntField(jImageData, format);
144
+ imageHO.orientation = (int) env->GetIntField(jImageData, orientation);
145
+ env->PopLocalFrame(nullptr);
146
+ }
147
+
148
+ } // namespace jsiConversion::core
149
+
150
+
151
+ Value imageDataHOToBase64(ImageDataHostObject &imageDataHO, Runtime &rt) {
152
+ JNIEnv *env;
153
+ bool needDetach = false;
154
+ int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
155
+ if (state == JNI_EDETACHED || env == nullptr) {
156
+ gJvm->AttachCurrentThread(&env, nullptr);
157
+ needDetach = true;
158
+ }
159
+
160
+ auto cls = env->FindClass("com/dynamsoft/reactnative/basicutils/ImageUtilKt");
161
+ auto imageData2base64 = env->GetStaticMethodID(cls, "imageData2base64", "(Lcom/dynamsoft/core/basic_structures/ImageData;)Ljava/lang/String;");
162
+
163
+ auto jImageData = jsiConversion::core::getJImageDataFromHO(env, imageDataHO);
164
+ auto jBase64 = (jstring) env->CallStaticObjectMethod(cls, imageData2base64, jImageData);
165
+ auto pBase64 = jBase64 ? env->GetStringUTFChars(jBase64, nullptr) : "";
166
+ env->DeleteLocalRef(cls);
167
+ env->DeleteLocalRef(jImageData);
168
+ if (jBase64 != nullptr)
169
+ env->ReleaseStringUTFChars(jBase64, pBase64);
170
+ if (needDetach)
171
+ gJvm->DetachCurrentThread();
172
+ return String::createFromUtf8(rt, string(pBase64));
173
+ }
174
+
175
+ void addImageToBuffer(ImageDataHostObject &imageDataHO, string &nativeIsaId) {
176
+ JNIEnv *env;
177
+ bool needDetach = false;
178
+ int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
179
+ if (state == JNI_EDETACHED || env == nullptr) {
180
+ gJvm->AttachCurrentThread(&env, nullptr);
181
+ needDetach = true;
182
+ }
183
+
184
+ env->PushLocalFrame(4);
185
+ jclass clsIsaModuleImpl = env->FindClass("com/dynamsoft/reactnativelib/core/ImageSourceAdapterModuleImpl");
186
+ jmethodID getISA =env->GetStaticMethodID(clsIsaModuleImpl, "getISA", "(Ljava/lang/String;)Lcom/dynamsoft/core/basic_structures/ImageSourceAdapter;");
187
+ jobject jISA = env->CallStaticObjectMethod(clsIsaModuleImpl, getISA, env->NewStringUTF(nativeIsaId.c_str()));
188
+
189
+ if(!env->IsSameObject(jISA, nullptr)) {
190
+ auto clsISA = env->FindClass("com/dynamsoft/core/basic_structures/ImageSourceAdapter");
191
+ auto addImageToBuffer = env->GetMethodID(clsISA, "addImageToBuffer", "(Lcom/dynamsoft/core/basic_structures/ImageData;)V");
192
+ env->CallVoidMethod(jISA, addImageToBuffer, jsiConversion::core::getJImageDataFromHO(env, imageDataHO));
193
+ }
194
+ env->PopLocalFrame(nullptr);
195
+
196
+ if (needDetach) {
197
+ gJvm->DetachCurrentThread();
198
+ }
199
+ }
200
+
201
+ ImageDataHostObject getImage(string &nativeIsaId) {
202
+ JNIEnv *env;
203
+ bool needDetach = false;
204
+ int state = gJvm->GetEnv((void **) &env, JNI_VERSION_1_6);
205
+ if (state == JNI_EDETACHED || env == nullptr) {
206
+ gJvm->AttachCurrentThread(&env, nullptr);
207
+ needDetach = true;
208
+ }
209
+
210
+ env->PushLocalFrame(4);
211
+ jclass clsIsaModuleImpl = env->FindClass("com/dynamsoft/reactnativelib/core/ImageSourceAdapterModuleImpl");
212
+ jmethodID getISA =env->GetStaticMethodID(clsIsaModuleImpl, "getISA", "(Ljava/lang/String;)Lcom/dynamsoft/core/basic_structures/ImageSourceAdapter;");
213
+ jobject jISA = env->CallStaticObjectMethod(clsIsaModuleImpl, getISA, env->NewStringUTF(nativeIsaId.c_str()));
214
+
215
+ ImageDataHostObject imageHO;
216
+ if(!env->IsSameObject(jISA, nullptr)) {
217
+ auto clsISA = env->FindClass("com/dynamsoft/core/basic_structures/ImageSourceAdapter");
218
+ auto getImage = env->GetMethodID(clsISA, "getImage", "()Lcom/dynamsoft/core/basic_structures/ImageData;");
219
+ auto jImageData = env->CallObjectMethod(jISA, getImage);
220
+ jsiConversion::core::getHOFromJImageData(env, jImageData, imageHO);
221
+ }
222
+ env->PopLocalFrame(nullptr);
223
+
224
+ if (needDetach) {
225
+ gJvm->DetachCurrentThread();
226
+ }
227
+ return imageHO;
228
+ }
229
+
230
+ #include "android_log.h"
231
+ #define JSI_FUNC [](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value
232
+
233
+ namespace jsi_install {
234
+ void install_imageDataToBase64(Runtime &jsiRuntime) {
235
+ if (!jsiRuntime.global().hasProperty(jsiRuntime, "imageDataToBase64")) {
236
+ auto nameId = PropNameID::forAscii(jsiRuntime, "imageDataToBase64");
237
+ auto imageDataToBase64Func = Function::createFromHostFunction(jsiRuntime, nameId, 1, JSI_FUNC {
238
+ auto obj = arguments[0].asObject(runtime);
239
+ auto imageDataHostObject = ImageDataHostObject::getHOFromObject(runtime, std::move(obj));
240
+ return imageDataHOToBase64(imageDataHostObject, runtime);
241
+ });
242
+ jsiRuntime.global().setProperty(jsiRuntime, nameId, imageDataToBase64Func);
243
+ }
244
+ }
245
+ namespace isa {
246
+ void install_addImageToBuffer(Runtime &jsiRuntime) {
247
+ if(!jsiRuntime.global().hasProperty(jsiRuntime, "isaAddImageToBuffer")) {
248
+ auto nameID = PropNameID::forAscii(jsiRuntime, "isaAddImageToBuffer");
249
+ auto func = Function::createFromHostFunction(jsiRuntime, nameID, 2, JSI_FUNC {
250
+ string nativeId = arguments[0].asString(runtime).utf8(runtime);
251
+ ImageDataHostObject imageDataHO = ImageDataHostObject::getHOFromObject(runtime, arguments[1].asObject(runtime));
252
+ addImageToBuffer(imageDataHO, nativeId);
253
+ return Value::undefined();
254
+ });
255
+ jsiRuntime.global().setProperty(jsiRuntime, nameID, func);
256
+ }
257
+ }
258
+ void install_getImageData(Runtime &jsiRuntime) {
259
+ if(!jsiRuntime.global().hasProperty(jsiRuntime, "isaGetImageData")) {
260
+ auto nameID = PropNameID::forAscii(jsiRuntime, "isaGetImageData");
261
+ auto func = Function::createFromHostFunction(jsiRuntime, nameID, 1, JSI_FUNC {
262
+ string nativeId = arguments[0].asString(runtime).utf8(runtime);
263
+ return Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(getImage(nativeId)));
264
+ });
265
+ jsiRuntime.global().setProperty(jsiRuntime, nameID, func);
266
+ }
267
+ }
268
+ } // namespace isa
269
+ } // namespace jsi_install
270
+
271
+ void install_coreMethods(Runtime &jsiRuntime) {
272
+ jsi_install::install_imageDataToBase64(jsiRuntime);
273
+ jsi_install::isa::install_addImageToBuffer(jsiRuntime);
274
+ jsi_install::isa::install_getImageData(jsiRuntime);
275
+ }
276
+
277
+ extern "C"
278
+ JNIEXPORT void JNICALL
279
+ Java_com_dynamsoft_reactnativelib_core_ImageSourceAdapterModuleImpl_nativeInstall(JNIEnv *env, jclass clz, jlong jsiPtr) {
280
+ auto runtime = reinterpret_cast<Runtime *>(jsiPtr);
281
+ if (runtime) {
282
+ install_coreMethods(*runtime);
283
+ }
284
+ }