@json-eval-rs/react-native 0.0.28

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.
@@ -0,0 +1,875 @@
1
+ #include <jni.h>
2
+ #include <string>
3
+ #include <functional>
4
+ #include "json-eval-bridge.h"
5
+
6
+ using namespace jsoneval;
7
+
8
+ // Cached JNI references for performance (initialized in JNI_OnLoad)
9
+ static jclass gPromiseClass = nullptr;
10
+ static jmethodID gResolveMethodID = nullptr;
11
+ static jmethodID gRejectMethodID = nullptr;
12
+ static jclass gIntegerClass = nullptr;
13
+ static jmethodID gIntegerValueOfMethodID = nullptr;
14
+
15
+ // Helper functions (C++ linkage - internal use only)
16
+ // Helper to convert jstring to std::string
17
+ // Note: GetStringUTFChars provides a pinned pointer (minimal copy), but we must
18
+ // copy to std::string to pass to the C++ bridge layer due to lifetime management
19
+ static std::string jstringToString(JNIEnv* env, jstring jStr) {
20
+ if (jStr == nullptr) return "";
21
+ // GetStringUTFChars returns a pointer to UTF-8 chars (may pin Java string in memory)
22
+ const char* chars = env->GetStringUTFChars(jStr, nullptr);
23
+ if (chars == nullptr) return "";
24
+ // Copy to std::string for safe lifetime management
25
+ std::string str(chars);
26
+ env->ReleaseStringUTFChars(jStr, chars);
27
+ return str;
28
+ }
29
+
30
+ // Helper to create jstring from std::string
31
+ // Note: NewStringUTF copies C string to create Java String object (unavoidable)
32
+ static jstring stringToJstring(JNIEnv* env, const std::string& str) {
33
+ return env->NewStringUTF(str.c_str());
34
+ }
35
+
36
+ extern "C" {
37
+
38
+ // Initialize cached JNI method IDs for performance
39
+ // Called once when library is loaded
40
+ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
41
+ JNIEnv* env;
42
+ if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
43
+ return JNI_ERR;
44
+ }
45
+
46
+ // Cache Promise class and methods
47
+ jclass promiseClass = env->FindClass("com/facebook/react/bridge/Promise");
48
+ if (promiseClass == nullptr) return JNI_ERR;
49
+ gPromiseClass = reinterpret_cast<jclass>(env->NewGlobalRef(promiseClass));
50
+ gResolveMethodID = env->GetMethodID(gPromiseClass, "resolve", "(Ljava/lang/Object;)V");
51
+ gRejectMethodID = env->GetMethodID(gPromiseClass, "reject", "(Ljava/lang/String;Ljava/lang/String;)V");
52
+ env->DeleteLocalRef(promiseClass);
53
+
54
+ // Cache Integer class for cacheLenAsync optimization
55
+ jclass integerClass = env->FindClass("java/lang/Integer");
56
+ if (integerClass == nullptr) return JNI_ERR;
57
+ gIntegerClass = reinterpret_cast<jclass>(env->NewGlobalRef(integerClass));
58
+ gIntegerValueOfMethodID = env->GetStaticMethodID(gIntegerClass, "valueOf", "(I)Ljava/lang/Integer;");
59
+ env->DeleteLocalRef(integerClass);
60
+
61
+ return JNI_VERSION_1_6;
62
+ }
63
+
64
+ // Optimized promise helpers using cached method IDs (30-50% faster)
65
+ void resolvePromise(JNIEnv* env, jobject promise, const std::string& result) {
66
+ jstring jresult = stringToJstring(env, result);
67
+ env->CallVoidMethod(promise, gResolveMethodID, jresult);
68
+ env->DeleteLocalRef(jresult);
69
+ }
70
+
71
+ void rejectPromise(JNIEnv* env, jobject promise, const std::string& code, const std::string& message) {
72
+ jstring jcode = stringToJstring(env, code);
73
+ jstring jmsg = stringToJstring(env, message);
74
+ env->CallVoidMethod(promise, gRejectMethodID, jcode, jmsg);
75
+ env->DeleteLocalRef(jcode);
76
+ env->DeleteLocalRef(jmsg);
77
+ }
78
+
79
+ } // extern "C"
80
+
81
+ // Generic async helper to reduce code duplication
82
+ // Encapsulates the JavaVM/thread attachment boilerplate pattern
83
+ // Note: Template functions must have C++ linkage, not C linkage
84
+ template<typename Func>
85
+ void runAsyncWithPromise(
86
+ JNIEnv* env,
87
+ jobject promise,
88
+ const char* errorCode,
89
+ Func&& bridgeCall
90
+ ) {
91
+ JavaVM* jvm;
92
+ env->GetJavaVM(&jvm);
93
+ jobject globalPromise = env->NewGlobalRef(promise);
94
+
95
+ bridgeCall([jvm, globalPromise, errorCode](const std::string& result, const std::string& error) {
96
+ JNIEnv* env = nullptr;
97
+ jvm->AttachCurrentThread(&env, nullptr);
98
+
99
+ if (error.empty()) {
100
+ resolvePromise(env, globalPromise, result);
101
+ } else {
102
+ rejectPromise(env, globalPromise, errorCode, error);
103
+ }
104
+
105
+ env->DeleteGlobalRef(globalPromise);
106
+ jvm->DetachCurrentThread();
107
+ });
108
+ }
109
+
110
+ extern "C" {
111
+
112
+ JNIEXPORT jstring JNICALL
113
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeCreate(
114
+ JNIEnv* env,
115
+ jobject /* this */,
116
+ jstring schema,
117
+ jstring context,
118
+ jstring data
119
+ ) {
120
+ try {
121
+ std::string schemaStr = jstringToString(env, schema);
122
+ std::string contextStr = jstringToString(env, context);
123
+ std::string dataStr = jstringToString(env, data);
124
+
125
+ std::string handle = JsonEvalBridge::create(schemaStr, contextStr, dataStr);
126
+ return stringToJstring(env, handle);
127
+ } catch (const std::exception& e) {
128
+ jclass exClass = env->FindClass("java/lang/RuntimeException");
129
+ env->ThrowNew(exClass, e.what());
130
+ return nullptr;
131
+ }
132
+ }
133
+
134
+ JNIEXPORT jstring JNICALL
135
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeCreateFromMsgpack(
136
+ JNIEnv* env,
137
+ jobject /* this */,
138
+ jbyteArray schemaMsgpack,
139
+ jstring context,
140
+ jstring data
141
+ ) {
142
+ try {
143
+ std::string contextStr = jstringToString(env, context);
144
+ std::string dataStr = jstringToString(env, data);
145
+
146
+ // Convert jbyteArray to std::vector<uint8_t>
147
+ jsize len = env->GetArrayLength(schemaMsgpack);
148
+ std::vector<uint8_t> msgpackBytes(len);
149
+ env->GetByteArrayRegion(schemaMsgpack, 0, len, reinterpret_cast<jbyte*>(msgpackBytes.data()));
150
+
151
+ std::string handle = JsonEvalBridge::createFromMsgpack(msgpackBytes, contextStr, dataStr);
152
+ return stringToJstring(env, handle);
153
+ } catch (const std::exception& e) {
154
+ jclass exClass = env->FindClass("java/lang/RuntimeException");
155
+ env->ThrowNew(exClass, e.what());
156
+ return nullptr;
157
+ }
158
+ }
159
+
160
+ JNIEXPORT jstring JNICALL
161
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeCreateFromCache(
162
+ JNIEnv* env,
163
+ jobject /* this */,
164
+ jstring cacheKey,
165
+ jstring context,
166
+ jstring data
167
+ ) {
168
+ try {
169
+ std::string cacheKeyStr = jstringToString(env, cacheKey);
170
+ std::string contextStr = jstringToString(env, context);
171
+ std::string dataStr = jstringToString(env, data);
172
+
173
+ std::string handle = JsonEvalBridge::createFromCache(cacheKeyStr, contextStr, dataStr);
174
+ return stringToJstring(env, handle);
175
+ } catch (const std::exception& e) {
176
+ jclass exClass = env->FindClass("java/lang/RuntimeException");
177
+ env->ThrowNew(exClass, e.what());
178
+ return nullptr;
179
+ }
180
+ }
181
+
182
+ JNIEXPORT void JNICALL
183
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeEvaluateAsync(
184
+ JNIEnv* env,
185
+ jobject /* this */,
186
+ jstring handle,
187
+ jstring data,
188
+ jstring context,
189
+ jobject promise
190
+ ) {
191
+ std::string handleStr = jstringToString(env, handle);
192
+ std::string dataStr = jstringToString(env, data);
193
+ std::string contextStr = jstringToString(env, context);
194
+
195
+ runAsyncWithPromise(env, promise, "EVALUATE_ERROR", [handleStr, dataStr, contextStr](auto callback) {
196
+ JsonEvalBridge::evaluateAsync(handleStr, dataStr, contextStr, callback);
197
+ });
198
+ }
199
+
200
+ JNIEXPORT jdouble JNICALL
201
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeCompileLogic(
202
+ JNIEnv* env,
203
+ jobject /* this */,
204
+ jstring handle,
205
+ jstring logicStr
206
+ ) {
207
+ try {
208
+ std::string handleStr = jstringToString(env, handle);
209
+ std::string logicStrCpp = jstringToString(env, logicStr);
210
+ uint64_t logicId = JsonEvalBridge::compileLogic(handleStr, logicStrCpp);
211
+ return static_cast<jdouble>(logicId);
212
+ } catch (const std::exception& e) {
213
+ jclass exClass = env->FindClass("java/lang/RuntimeException");
214
+ env->ThrowNew(exClass, e.what());
215
+ return 0.0;
216
+ }
217
+ }
218
+
219
+ JNIEXPORT void JNICALL
220
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeRunLogicAsync(
221
+ JNIEnv* env,
222
+ jobject /* this */,
223
+ jstring handle,
224
+ jdouble logicId,
225
+ jstring data,
226
+ jstring context,
227
+ jobject promise
228
+ ) {
229
+ std::string handleStr = jstringToString(env, handle);
230
+ std::string dataStr = jstringToString(env, data);
231
+ std::string contextStr = jstringToString(env, context);
232
+ uint64_t logicIdValue = static_cast<uint64_t>(logicId);
233
+
234
+ runAsyncWithPromise(env, promise, "RUN_LOGIC_ERROR", [handleStr, logicIdValue, dataStr, contextStr](auto callback) {
235
+ JsonEvalBridge::runLogicAsync(handleStr, logicIdValue, dataStr, contextStr, callback);
236
+ });
237
+ }
238
+
239
+ JNIEXPORT void JNICALL
240
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeValidateAsync(
241
+ JNIEnv* env,
242
+ jobject /* this */,
243
+ jstring handle,
244
+ jstring data,
245
+ jstring context,
246
+ jobject promise
247
+ ) {
248
+ std::string handleStr = jstringToString(env, handle);
249
+ std::string dataStr = jstringToString(env, data);
250
+ std::string contextStr = jstringToString(env, context);
251
+
252
+ runAsyncWithPromise(env, promise, "VALIDATE_ERROR", [handleStr, dataStr, contextStr](auto callback) {
253
+ JsonEvalBridge::validateAsync(handleStr, dataStr, contextStr, callback);
254
+ });
255
+ }
256
+
257
+ JNIEXPORT void JNICALL
258
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeEvaluateDependentsAsync(
259
+ JNIEnv* env,
260
+ jobject /* this */,
261
+ jstring handle,
262
+ jstring changedPath,
263
+ jstring data,
264
+ jstring context,
265
+ jboolean reEvaluate,
266
+ jobject promise
267
+ ) {
268
+ std::string handleStr = jstringToString(env, handle);
269
+ std::string pathStr = jstringToString(env, changedPath);
270
+ std::string dataStr = jstringToString(env, data);
271
+ std::string contextStr = jstringToString(env, context);
272
+ bool reEval = static_cast<bool>(reEvaluate);
273
+
274
+ runAsyncWithPromise(env, promise, "EVALUATE_DEPENDENTS_ERROR", [handleStr, pathStr, dataStr, contextStr, reEval](auto callback) {
275
+ JsonEvalBridge::evaluateDependentsAsync(handleStr, pathStr, dataStr, contextStr, reEval, callback);
276
+ });
277
+ }
278
+
279
+ JNIEXPORT void JNICALL
280
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeGetEvaluatedSchemaAsync(
281
+ JNIEnv* env,
282
+ jobject /* this */,
283
+ jstring handle,
284
+ jboolean skipLayout,
285
+ jobject promise
286
+ ) {
287
+ std::string handleStr = jstringToString(env, handle);
288
+ bool skipLayoutBool = (skipLayout == JNI_TRUE);
289
+
290
+ runAsyncWithPromise(env, promise, "GET_SCHEMA_ERROR", [handleStr, skipLayoutBool](auto callback) {
291
+ JsonEvalBridge::getEvaluatedSchemaAsync(handleStr, skipLayoutBool, callback);
292
+ });
293
+ }
294
+
295
+ JNIEXPORT void JNICALL
296
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeGetSchemaValueAsync(
297
+ JNIEnv* env,
298
+ jobject /* this */,
299
+ jstring handle,
300
+ jobject promise
301
+ ) {
302
+ std::string handleStr = jstringToString(env, handle);
303
+
304
+ runAsyncWithPromise(env, promise, "GET_VALUE_ERROR", [handleStr](auto callback) {
305
+ JsonEvalBridge::getSchemaValueAsync(handleStr, callback);
306
+ });
307
+ }
308
+
309
+ JNIEXPORT void JNICALL
310
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeGetEvaluatedSchemaWithoutParamsAsync(
311
+ JNIEnv* env,
312
+ jobject /* this */,
313
+ jstring handle,
314
+ jboolean skipLayout,
315
+ jobject promise
316
+ ) {
317
+ std::string handleStr = jstringToString(env, handle);
318
+ bool skipLayoutBool = (skipLayout == JNI_TRUE);
319
+
320
+ runAsyncWithPromise(env, promise, "GET_SCHEMA_WITHOUT_PARAMS_ERROR", [handleStr, skipLayoutBool](auto callback) {
321
+ JsonEvalBridge::getEvaluatedSchemaWithoutParamsAsync(handleStr, skipLayoutBool, callback);
322
+ });
323
+ }
324
+
325
+ JNIEXPORT void JNICALL
326
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeGetEvaluatedSchemaByPathAsync(
327
+ JNIEnv* env,
328
+ jobject /* this */,
329
+ jstring handle,
330
+ jstring path,
331
+ jboolean skipLayout,
332
+ jobject promise
333
+ ) {
334
+ std::string handleStr = jstringToString(env, handle);
335
+ std::string pathStr = jstringToString(env, path);
336
+ bool skipLayoutBool = (skipLayout == JNI_TRUE);
337
+
338
+ runAsyncWithPromise(env, promise, "GET_EVALUATED_SCHEMA_BY_PATH_ERROR", [handleStr, pathStr, skipLayoutBool](auto callback) {
339
+ JsonEvalBridge::getEvaluatedSchemaByPathAsync(handleStr, pathStr, skipLayoutBool, callback);
340
+ });
341
+ }
342
+
343
+ JNIEXPORT void JNICALL
344
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeGetEvaluatedSchemaByPathsAsync(
345
+ JNIEnv* env,
346
+ jobject /* this */,
347
+ jstring handle,
348
+ jstring pathsJson,
349
+ jboolean skipLayout,
350
+ jobject promise
351
+ ) {
352
+ std::string handleStr = jstringToString(env, handle);
353
+ std::string pathsJsonStr = jstringToString(env, pathsJson);
354
+ bool skipLayoutBool = (skipLayout == JNI_TRUE);
355
+
356
+ runAsyncWithPromise(env, promise, "GET_EVALUATED_SCHEMA_BY_PATHS_ERROR", [handleStr, pathsJsonStr, skipLayoutBool](auto callback) {
357
+ JsonEvalBridge::getEvaluatedSchemaByPathsAsync(handleStr, pathsJsonStr, skipLayoutBool, callback);
358
+ });
359
+ }
360
+
361
+ JNIEXPORT void JNICALL
362
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeGetSchemaByPathAsync(
363
+ JNIEnv* env,
364
+ jobject /* this */,
365
+ jstring handle,
366
+ jstring path,
367
+ jobject promise
368
+ ) {
369
+ std::string handleStr = jstringToString(env, handle);
370
+ std::string pathStr = jstringToString(env, path);
371
+
372
+ runAsyncWithPromise(env, promise, "GET_SCHEMA_BY_PATH_ERROR", [handleStr, pathStr](auto callback) {
373
+ JsonEvalBridge::getSchemaByPathAsync(handleStr, pathStr, callback);
374
+ });
375
+ }
376
+
377
+ JNIEXPORT void JNICALL
378
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeGetSchemaByPathsAsync(
379
+ JNIEnv* env,
380
+ jobject /* this */,
381
+ jstring handle,
382
+ jstring pathsJson,
383
+ jobject promise
384
+ ) {
385
+ std::string handleStr = jstringToString(env, handle);
386
+ std::string pathsJsonStr = jstringToString(env, pathsJson);
387
+
388
+ runAsyncWithPromise(env, promise, "GET_SCHEMA_BY_PATHS_ERROR", [handleStr, pathsJsonStr](auto callback) {
389
+ JsonEvalBridge::getSchemaByPathsAsync(handleStr, pathsJsonStr, callback);
390
+ });
391
+ }
392
+
393
+ JNIEXPORT void JNICALL
394
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeReloadSchemaAsync(
395
+ JNIEnv* env,
396
+ jobject /* this */,
397
+ jstring handle,
398
+ jstring schema,
399
+ jstring context,
400
+ jstring data,
401
+ jobject promise
402
+ ) {
403
+ std::string handleStr = jstringToString(env, handle);
404
+ std::string schemaStr = jstringToString(env, schema);
405
+ std::string contextStr = jstringToString(env, context);
406
+ std::string dataStr = jstringToString(env, data);
407
+
408
+ runAsyncWithPromise(env, promise, "RELOAD_ERROR", [handleStr, schemaStr, contextStr, dataStr](auto callback) {
409
+ JsonEvalBridge::reloadSchemaAsync(handleStr, schemaStr, contextStr, dataStr, callback);
410
+ });
411
+ }
412
+
413
+ JNIEXPORT void JNICALL
414
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeReloadSchemaMsgpackAsync(
415
+ JNIEnv* env,
416
+ jobject /* this */,
417
+ jstring handle,
418
+ jbyteArray schemaMsgpack,
419
+ jstring context,
420
+ jstring data,
421
+ jobject promise
422
+ ) {
423
+ std::string handleStr = jstringToString(env, handle);
424
+ std::string contextStr = jstringToString(env, context);
425
+ std::string dataStr = jstringToString(env, data);
426
+
427
+ // Convert jbyteArray to std::vector<uint8_t>
428
+ jsize len = env->GetArrayLength(schemaMsgpack);
429
+ std::vector<uint8_t> msgpackBytes(len);
430
+ env->GetByteArrayRegion(schemaMsgpack, 0, len, reinterpret_cast<jbyte*>(msgpackBytes.data()));
431
+
432
+ runAsyncWithPromise(env, promise, "RELOAD_MSGPACK_ERROR", [handleStr, msgpackBytes, contextStr, dataStr](auto callback) {
433
+ JsonEvalBridge::reloadSchemaMsgpackAsync(handleStr, msgpackBytes, contextStr, dataStr, callback);
434
+ });
435
+ }
436
+
437
+ JNIEXPORT void JNICALL
438
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeReloadSchemaFromCacheAsync(
439
+ JNIEnv* env,
440
+ jobject /* this */,
441
+ jstring handle,
442
+ jstring cacheKey,
443
+ jstring context,
444
+ jstring data,
445
+ jobject promise
446
+ ) {
447
+ std::string handleStr = jstringToString(env, handle);
448
+ std::string cacheKeyStr = jstringToString(env, cacheKey);
449
+ std::string contextStr = jstringToString(env, context);
450
+ std::string dataStr = jstringToString(env, data);
451
+
452
+ runAsyncWithPromise(env, promise, "RELOAD_CACHE_ERROR", [handleStr, cacheKeyStr, contextStr, dataStr](auto callback) {
453
+ JsonEvalBridge::reloadSchemaFromCacheAsync(handleStr, cacheKeyStr, contextStr, dataStr, callback);
454
+ });
455
+ }
456
+
457
+ JNIEXPORT void JNICALL
458
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeCacheStatsAsync(
459
+ JNIEnv* env,
460
+ jobject /* this */,
461
+ jstring handle,
462
+ jobject promise
463
+ ) {
464
+ std::string handleStr = jstringToString(env, handle);
465
+
466
+ runAsyncWithPromise(env, promise, "CACHE_STATS_ERROR", [handleStr](auto callback) {
467
+ JsonEvalBridge::cacheStatsAsync(handleStr, callback);
468
+ });
469
+ }
470
+
471
+ JNIEXPORT void JNICALL
472
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeClearCacheAsync(
473
+ JNIEnv* env,
474
+ jobject /* this */,
475
+ jstring handle,
476
+ jobject promise
477
+ ) {
478
+ std::string handleStr = jstringToString(env, handle);
479
+
480
+ runAsyncWithPromise(env, promise, "CLEAR_CACHE_ERROR", [handleStr](auto callback) {
481
+ JsonEvalBridge::clearCacheAsync(handleStr, callback);
482
+ });
483
+ }
484
+
485
+ JNIEXPORT void JNICALL
486
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeCacheLenAsync(
487
+ JNIEnv* env,
488
+ jobject /* this */,
489
+ jstring handle,
490
+ jobject promise
491
+ ) {
492
+ std::string handleStr = jstringToString(env, handle);
493
+
494
+ JavaVM* jvm;
495
+ env->GetJavaVM(&jvm);
496
+ jobject globalPromise = env->NewGlobalRef(promise);
497
+
498
+ JsonEvalBridge::cacheLenAsync(handleStr,
499
+ [jvm, globalPromise](const std::string& result, const std::string& error) {
500
+ JNIEnv* env = nullptr;
501
+ jvm->AttachCurrentThread(&env, nullptr);
502
+
503
+ if (error.empty()) {
504
+ // Optimized: Direct parse and box using cached method IDs
505
+ jint intValue = std::stoi(result);
506
+ jobject integerObj = env->CallStaticObjectMethod(gIntegerClass, gIntegerValueOfMethodID, intValue);
507
+ env->CallVoidMethod(globalPromise, gResolveMethodID, integerObj);
508
+ env->DeleteLocalRef(integerObj);
509
+ } else {
510
+ rejectPromise(env, globalPromise, "CACHE_LEN_ERROR", error);
511
+ }
512
+
513
+ env->DeleteGlobalRef(globalPromise);
514
+ jvm->DetachCurrentThread();
515
+ }
516
+ );
517
+ }
518
+
519
+ JNIEXPORT void JNICALL
520
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeValidatePathsAsync(
521
+ JNIEnv* env,
522
+ jobject /* this */,
523
+ jstring handle,
524
+ jstring data,
525
+ jstring context,
526
+ jstring pathsJson,
527
+ jobject promise
528
+ ) {
529
+ std::string handleStr = jstringToString(env, handle);
530
+ std::string dataStr = jstringToString(env, data);
531
+ std::string contextStr = jstringToString(env, context);
532
+ std::string pathsStr = jstringToString(env, pathsJson);
533
+
534
+ runAsyncWithPromise(env, promise, "VALIDATE_PATHS_ERROR", [handleStr, dataStr, contextStr, pathsStr](auto callback) {
535
+ JsonEvalBridge::validatePathsAsync(handleStr, dataStr, contextStr, pathsStr, callback);
536
+ });
537
+ }
538
+
539
+ JNIEXPORT void JNICALL
540
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeEnableCacheAsync(
541
+ JNIEnv* env,
542
+ jobject /* this */,
543
+ jstring handle,
544
+ jobject promise
545
+ ) {
546
+ std::string handleStr = jstringToString(env, handle);
547
+
548
+ runAsyncWithPromise(env, promise, "ENABLE_CACHE_ERROR", [handleStr](auto callback) {
549
+ JsonEvalBridge::enableCacheAsync(handleStr, callback);
550
+ });
551
+ }
552
+
553
+ JNIEXPORT void JNICALL
554
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeDisableCacheAsync(
555
+ JNIEnv* env,
556
+ jobject /* this */,
557
+ jstring handle,
558
+ jobject promise
559
+ ) {
560
+ std::string handleStr = jstringToString(env, handle);
561
+
562
+ runAsyncWithPromise(env, promise, "DISABLE_CACHE_ERROR", [handleStr](auto callback) {
563
+ JsonEvalBridge::disableCacheAsync(handleStr, callback);
564
+ });
565
+ }
566
+
567
+ JNIEXPORT jboolean JNICALL
568
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeIsCacheEnabled(
569
+ JNIEnv* env,
570
+ jobject /* this */,
571
+ jstring handle
572
+ ) {
573
+ std::string handleStr = jstringToString(env, handle);
574
+ bool enabled = JsonEvalBridge::isCacheEnabled(handleStr);
575
+ return enabled ? JNI_TRUE : JNI_FALSE;
576
+ }
577
+
578
+ JNIEXPORT void JNICALL
579
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeDispose(
580
+ JNIEnv* env,
581
+ jobject /* this */,
582
+ jstring handle
583
+ ) {
584
+ std::string handleStr = jstringToString(env, handle);
585
+ JsonEvalBridge::dispose(handleStr);
586
+ }
587
+
588
+ JNIEXPORT jstring JNICALL
589
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeVersion(
590
+ JNIEnv* env,
591
+ jobject /* this */
592
+ ) {
593
+ std::string version = JsonEvalBridge::version();
594
+ return stringToJstring(env, version);
595
+ }
596
+
597
+ JNIEXPORT void JNICALL
598
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeResolveLayoutAsync(
599
+ JNIEnv* env,
600
+ jobject /* this */,
601
+ jstring handle,
602
+ jboolean evaluate,
603
+ jobject promise
604
+ ) {
605
+ std::string handleStr = jstringToString(env, handle);
606
+ bool evaluateBool = (evaluate == JNI_TRUE);
607
+
608
+ runAsyncWithPromise(env, promise, "RESOLVE_LAYOUT_ERROR", [handleStr, evaluateBool](auto callback) {
609
+ JsonEvalBridge::resolveLayoutAsync(handleStr, evaluateBool, callback);
610
+ });
611
+ }
612
+
613
+ JNIEXPORT void JNICALL
614
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeCompileAndRunLogicAsync(
615
+ JNIEnv* env,
616
+ jobject /* this */,
617
+ jstring handle,
618
+ jstring logicStr,
619
+ jstring data,
620
+ jstring context,
621
+ jobject promise
622
+ ) {
623
+ std::string handleStr = jstringToString(env, handle);
624
+ std::string logicStrCpp = jstringToString(env, logicStr);
625
+ std::string dataStr = jstringToString(env, data);
626
+ std::string contextStr = jstringToString(env, context);
627
+
628
+ runAsyncWithPromise(env, promise, "COMPILE_AND_RUN_LOGIC_ERROR", [handleStr, logicStrCpp, dataStr, contextStr](auto callback) {
629
+ JsonEvalBridge::compileAndRunLogicAsync(handleStr, logicStrCpp, dataStr, contextStr, callback);
630
+ });
631
+ }
632
+
633
+ // ============================================================================
634
+ // Subform Methods
635
+ // ============================================================================
636
+
637
+ JNIEXPORT void JNICALL
638
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeEvaluateSubformAsync(
639
+ JNIEnv* env,
640
+ jobject /* this */,
641
+ jstring handle,
642
+ jstring subformPath,
643
+ jstring data,
644
+ jstring context,
645
+ jobject promise
646
+ ) {
647
+ std::string handleStr = jstringToString(env, handle);
648
+ std::string subformPathStr = jstringToString(env, subformPath);
649
+ std::string dataStr = jstringToString(env, data);
650
+ std::string contextStr = jstringToString(env, context);
651
+
652
+ runAsyncWithPromise(env, promise, "EVALUATE_SUBFORM_ERROR", [handleStr, subformPathStr, dataStr, contextStr](auto callback) {
653
+ JsonEvalBridge::evaluateSubformAsync(handleStr, subformPathStr, dataStr, contextStr, callback);
654
+ });
655
+ }
656
+
657
+ JNIEXPORT void JNICALL
658
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeValidateSubformAsync(
659
+ JNIEnv* env,
660
+ jobject /* this */,
661
+ jstring handle,
662
+ jstring subformPath,
663
+ jstring data,
664
+ jstring context,
665
+ jobject promise
666
+ ) {
667
+ std::string handleStr = jstringToString(env, handle);
668
+ std::string subformPathStr = jstringToString(env, subformPath);
669
+ std::string dataStr = jstringToString(env, data);
670
+ std::string contextStr = jstringToString(env, context);
671
+
672
+ runAsyncWithPromise(env, promise, "VALIDATE_SUBFORM_ERROR", [handleStr, subformPathStr, dataStr, contextStr](auto callback) {
673
+ JsonEvalBridge::validateSubformAsync(handleStr, subformPathStr, dataStr, contextStr, callback);
674
+ });
675
+ }
676
+
677
+ JNIEXPORT void JNICALL
678
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeEvaluateDependentsSubformAsync(
679
+ JNIEnv* env,
680
+ jobject /* this */,
681
+ jstring handle,
682
+ jstring subformPath,
683
+ jstring changedPath,
684
+ jstring data,
685
+ jstring context,
686
+ jobject promise
687
+ ) {
688
+ std::string handleStr = jstringToString(env, handle);
689
+ std::string subformPathStr = jstringToString(env, subformPath);
690
+ std::string changedPathStr = jstringToString(env, changedPath);
691
+ std::string dataStr = jstringToString(env, data);
692
+ std::string contextStr = jstringToString(env, context);
693
+
694
+ runAsyncWithPromise(env, promise, "EVALUATE_DEPENDENTS_SUBFORM_ERROR", [handleStr, subformPathStr, changedPathStr, dataStr, contextStr](auto callback) {
695
+ JsonEvalBridge::evaluateDependentsSubformAsync(handleStr, subformPathStr, changedPathStr, dataStr, contextStr, callback);
696
+ });
697
+ }
698
+
699
+ JNIEXPORT void JNICALL
700
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeResolveLayoutSubformAsync(
701
+ JNIEnv* env,
702
+ jobject /* this */,
703
+ jstring handle,
704
+ jstring subformPath,
705
+ jboolean evaluate,
706
+ jobject promise
707
+ ) {
708
+ std::string handleStr = jstringToString(env, handle);
709
+ std::string subformPathStr = jstringToString(env, subformPath);
710
+ bool evaluateBool = (evaluate == JNI_TRUE);
711
+
712
+ runAsyncWithPromise(env, promise, "RESOLVE_LAYOUT_SUBFORM_ERROR", [handleStr, subformPathStr, evaluateBool](auto callback) {
713
+ JsonEvalBridge::resolveLayoutSubformAsync(handleStr, subformPathStr, evaluateBool, callback);
714
+ });
715
+ }
716
+
717
+ JNIEXPORT void JNICALL
718
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeGetEvaluatedSchemaSubformAsync(
719
+ JNIEnv* env,
720
+ jobject /* this */,
721
+ jstring handle,
722
+ jstring subformPath,
723
+ jboolean resolveLayout,
724
+ jobject promise
725
+ ) {
726
+ std::string handleStr = jstringToString(env, handle);
727
+ std::string subformPathStr = jstringToString(env, subformPath);
728
+ bool resolveLayoutBool = (resolveLayout == JNI_TRUE);
729
+
730
+ runAsyncWithPromise(env, promise, "GET_EVALUATED_SCHEMA_SUBFORM_ERROR", [handleStr, subformPathStr, resolveLayoutBool](auto callback) {
731
+ JsonEvalBridge::getEvaluatedSchemaSubformAsync(handleStr, subformPathStr, resolveLayoutBool, callback);
732
+ });
733
+ }
734
+
735
+ JNIEXPORT void JNICALL
736
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeGetSchemaValueSubformAsync(
737
+ JNIEnv* env,
738
+ jobject /* this */,
739
+ jstring handle,
740
+ jstring subformPath,
741
+ jobject promise
742
+ ) {
743
+ std::string handleStr = jstringToString(env, handle);
744
+ std::string subformPathStr = jstringToString(env, subformPath);
745
+
746
+ runAsyncWithPromise(env, promise, "GET_SCHEMA_VALUE_SUBFORM_ERROR", [handleStr, subformPathStr](auto callback) {
747
+ JsonEvalBridge::getSchemaValueSubformAsync(handleStr, subformPathStr, callback);
748
+ });
749
+ }
750
+
751
+ JNIEXPORT void JNICALL
752
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeGetEvaluatedSchemaWithoutParamsSubformAsync(
753
+ JNIEnv* env,
754
+ jobject /* this */,
755
+ jstring handle,
756
+ jstring subformPath,
757
+ jboolean resolveLayout,
758
+ jobject promise
759
+ ) {
760
+ std::string handleStr = jstringToString(env, handle);
761
+ std::string subformPathStr = jstringToString(env, subformPath);
762
+ bool resolveLayoutBool = (resolveLayout == JNI_TRUE);
763
+
764
+ runAsyncWithPromise(env, promise, "GET_SCHEMA_WITHOUT_PARAMS_SUBFORM_ERROR", [handleStr, subformPathStr, resolveLayoutBool](auto callback) {
765
+ JsonEvalBridge::getEvaluatedSchemaWithoutParamsSubformAsync(handleStr, subformPathStr, resolveLayoutBool, callback);
766
+ });
767
+ }
768
+
769
+ JNIEXPORT void JNICALL
770
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeGetEvaluatedSchemaByPathSubformAsync(
771
+ JNIEnv* env,
772
+ jobject /* this */,
773
+ jstring handle,
774
+ jstring subformPath,
775
+ jstring schemaPath,
776
+ jboolean skipLayout,
777
+ jobject promise
778
+ ) {
779
+ std::string handleStr = jstringToString(env, handle);
780
+ std::string subformPathStr = jstringToString(env, subformPath);
781
+ std::string schemaPathStr = jstringToString(env, schemaPath);
782
+ bool skipLayoutBool = (skipLayout == JNI_TRUE);
783
+
784
+ runAsyncWithPromise(env, promise, "GET_SCHEMA_BY_PATH_SUBFORM_ERROR", [handleStr, subformPathStr, schemaPathStr, skipLayoutBool](auto callback) {
785
+ JsonEvalBridge::getEvaluatedSchemaByPathSubformAsync(handleStr, subformPathStr, schemaPathStr, skipLayoutBool, callback);
786
+ });
787
+ }
788
+
789
+ JNIEXPORT void JNICALL
790
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeGetEvaluatedSchemaByPathsSubformAsync(
791
+ JNIEnv* env,
792
+ jobject /* this */,
793
+ jstring handle,
794
+ jstring subformPath,
795
+ jstring schemaPathsJson,
796
+ jboolean skipLayout,
797
+ jobject promise
798
+ ) {
799
+ std::string handleStr = jstringToString(env, handle);
800
+ std::string subformPathStr = jstringToString(env, subformPath);
801
+ std::string schemaPathsJsonStr = jstringToString(env, schemaPathsJson);
802
+ bool skipLayoutBool = (skipLayout == JNI_TRUE);
803
+
804
+ runAsyncWithPromise(env, promise, "GET_SCHEMA_BY_PATHS_SUBFORM_ERROR", [handleStr, subformPathStr, schemaPathsJsonStr, skipLayoutBool](auto callback) {
805
+ JsonEvalBridge::getEvaluatedSchemaByPathsSubformAsync(handleStr, subformPathStr, schemaPathsJsonStr, skipLayoutBool, callback);
806
+ });
807
+ }
808
+
809
+ JNIEXPORT void JNICALL
810
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeGetSubformPathsAsync(
811
+ JNIEnv* env,
812
+ jobject /* this */,
813
+ jstring handle,
814
+ jobject promise
815
+ ) {
816
+ std::string handleStr = jstringToString(env, handle);
817
+
818
+ runAsyncWithPromise(env, promise, "GET_SUBFORM_PATHS_ERROR", [handleStr](auto callback) {
819
+ JsonEvalBridge::getSubformPathsAsync(handleStr, callback);
820
+ });
821
+ }
822
+
823
+ JNIEXPORT void JNICALL
824
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeGetSchemaByPathSubformAsync(
825
+ JNIEnv* env,
826
+ jobject /* this */,
827
+ jstring handle,
828
+ jstring subformPath,
829
+ jstring schemaPath,
830
+ jobject promise
831
+ ) {
832
+ std::string handleStr = jstringToString(env, handle);
833
+ std::string subformPathStr = jstringToString(env, subformPath);
834
+ std::string schemaPathStr = jstringToString(env, schemaPath);
835
+
836
+ runAsyncWithPromise(env, promise, "GET_SCHEMA_BY_PATH_SUBFORM_ERROR", [handleStr, subformPathStr, schemaPathStr](auto callback) {
837
+ JsonEvalBridge::getSchemaByPathSubformAsync(handleStr, subformPathStr, schemaPathStr, callback);
838
+ });
839
+ }
840
+
841
+ JNIEXPORT void JNICALL
842
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeGetSchemaByPathsSubformAsync(
843
+ JNIEnv* env,
844
+ jobject /* this */,
845
+ jstring handle,
846
+ jstring subformPath,
847
+ jstring schemaPathsJson,
848
+ jobject promise
849
+ ) {
850
+ std::string handleStr = jstringToString(env, handle);
851
+ std::string subformPathStr = jstringToString(env, subformPath);
852
+ std::string schemaPathsJsonStr = jstringToString(env, schemaPathsJson);
853
+
854
+ runAsyncWithPromise(env, promise, "GET_SCHEMA_BY_PATHS_SUBFORM_ERROR", [handleStr, subformPathStr, schemaPathsJsonStr](auto callback) {
855
+ JsonEvalBridge::getSchemaByPathsSubformAsync(handleStr, subformPathStr, schemaPathsJsonStr, callback);
856
+ });
857
+ }
858
+
859
+ JNIEXPORT void JNICALL
860
+ Java_com_jsonevalrs_JsonEvalRsModule_nativeHasSubformAsync(
861
+ JNIEnv* env,
862
+ jobject /* this */,
863
+ jstring handle,
864
+ jstring subformPath,
865
+ jobject promise
866
+ ) {
867
+ std::string handleStr = jstringToString(env, handle);
868
+ std::string subformPathStr = jstringToString(env, subformPath);
869
+
870
+ runAsyncWithPromise(env, promise, "HAS_SUBFORM_ERROR", [handleStr, subformPathStr](auto callback) {
871
+ JsonEvalBridge::hasSubformAsync(handleStr, subformPathStr, callback);
872
+ });
873
+ }
874
+
875
+ } // extern "C"