Skip to main content

ri/java/classes/
core.rs

1//! Copyright © 2025-2026 Wenze Wei. All Rights Reserved.
2//!
3//! This file is part of Ri.
4//! The Ri project belongs to the Dunimd Team.
5//!
6//! Licensed under the Apache License, Version 2.0 (the "License");
7//! You may not use this file except in compliance with the License.
8//! You may obtain a copy of the License at
9//!
10//!     http://www.apache.org/licenses/LICENSE-2.0
11//!
12//! Unless required by applicable law or agreed to in writing, software
13//! distributed under the License is distributed on an "AS IS" BASIS,
14//! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15//! See the License for the specific language governing permissions and
16//! limitations under the License.
17
18//! # Core Module JNI Bindings
19//!
20//! JNI bindings for Ri core classes.
21
22use jni::JNIEnv;
23use jni::objects::{JClass, JString};
24use jni::sys::{jlong, jboolean, jstring, jint};
25use crate::core::{RiAppBuilder, RiAppRuntime, RiError, RiServiceContext, RiHealthStatus, RiHealthCheckResult, RiHealthCheckConfig, RiHealthReport, RiHealthChecker, RiErrorChain, RiLockError, RiLifecycleObserver, RiLogAnalyticsModule, ServiceModule};
26use crate::java::exception::{throw_ri_error, check_not_null};
27use crate::config::RiConfig;
28use std::time::Duration;
29use std::sync::Arc;
30
31// =============================================================================
32// RiAppBuilder JNI Bindings
33// =============================================================================
34
35#[no_mangle]
36pub extern "system" fn Java_com_dunimd_ri_RiAppBuilder_new0(
37    _env: JNIEnv,
38    _class: JClass,
39) -> jlong {
40    let builder = Box::new(RiAppBuilder::new());
41    Box::into_raw(builder) as jlong
42}
43
44#[no_mangle]
45pub extern "system" fn Java_com_dunimd_ri_RiAppBuilder_withConfig0(
46    mut env: JNIEnv,
47    _class: JClass,
48    ptr: jlong,
49    config_path: JString,
50) -> jlong {
51    if !check_not_null(&mut env, ptr, "RiAppBuilder") {
52        return 0;
53    }
54
55    // Ownership note: withConfig0 ALWAYS consumes the builder (even on error), matching
56    // the Java-side contract that clears nativePtr before/after this call.
57    let builder = unsafe { Box::from_raw(ptr as *mut RiAppBuilder) };
58    let path: String = match env.get_string(&config_path) {
59        Ok(s) => s.into(),
60        Err(e) => {
61            throw_ri_error(&mut env, &format!("Failed to read config path: {e}"));
62            return 0;
63        }
64    };
65
66    match builder.with_config(&path) {
67        Ok(new_builder) => {
68            let boxed = Box::new(new_builder);
69            Box::into_raw(boxed) as jlong
70        }
71        Err(e) => {
72            throw_ri_error(&mut env, &e.to_string());
73            0
74        }
75    }
76}
77
78#[no_mangle]
79pub extern "system" fn Java_com_dunimd_ri_RiAppBuilder_build0(
80    mut env: JNIEnv,
81    _class: JClass,
82    ptr: jlong,
83) -> jlong {
84    if !check_not_null(&mut env, ptr, "RiAppBuilder") {
85        return 0;
86    }
87    
88    let builder = unsafe { Box::from_raw(ptr as *mut RiAppBuilder) };
89    
90    match builder.build() {
91        Ok(runtime) => {
92            let boxed = Box::new(runtime);
93            Box::into_raw(boxed) as jlong
94        }
95        Err(e) => {
96            throw_ri_error(&mut env, &e.to_string());
97            0
98        }
99    }
100}
101
102#[no_mangle]
103pub extern "system" fn Java_com_dunimd_ri_RiAppBuilder_free0(
104    _env: JNIEnv,
105    _class: JClass,
106    ptr: jlong,
107) {
108    if ptr != 0 {
109        unsafe {
110            let _ = Box::from_raw(ptr as *mut RiAppBuilder);
111        }
112    }
113}
114
115// =============================================================================
116// RiAppRuntime JNI Bindings
117// =============================================================================
118
119#[no_mangle]
120pub extern "system" fn Java_com_dunimd_ri_RiAppRuntime_free0(
121    _env: JNIEnv,
122    _class: JClass,
123    ptr: jlong,
124) {
125    if ptr != 0 {
126        unsafe {
127            let _ = Box::from_raw(ptr as *mut RiAppRuntime);
128        }
129    }
130}
131
132#[no_mangle]
133pub extern "system" fn Java_com_dunimd_ri_RiAppRuntime_isRunning0(
134    mut env: JNIEnv,
135    _class: JClass,
136    ptr: jlong,
137) -> jboolean {
138    if !check_not_null(&mut env, ptr, "RiAppRuntime") {
139        return 0;
140    }
141
142    let runtime = unsafe { &*(ptr as *const RiAppRuntime) };
143    if runtime.is_running() { 1 } else { 0 }
144}
145
146#[no_mangle]
147pub extern "system" fn Java_com_dunimd_ri_RiAppRuntime_shutdown0(
148    mut env: JNIEnv,
149    _class: JClass,
150    ptr: jlong,
151) {
152    if !check_not_null(&mut env, ptr, "RiAppRuntime") {
153        return;
154    }
155
156    let runtime = unsafe { &mut *(ptr as *mut RiAppRuntime) };
157    crate::java::runtime::block_on_jni(&mut env, "RiAppRuntime::shutdown", runtime.shutdown());
158}
159
160// =============================================================================
161// RiConfig JNI Bindings
162// =============================================================================
163
164#[no_mangle]
165pub extern "system" fn Java_com_dunimd_ri_RiConfig_new0(
166    _env: JNIEnv,
167    _class: JClass,
168) -> jlong {
169    let config = Box::new(RiConfig::default());
170    Box::into_raw(config) as jlong
171}
172
173#[no_mangle]
174pub extern "system" fn Java_com_dunimd_ri_RiConfig_free0(
175    _env: JNIEnv,
176    _class: JClass,
177    ptr: jlong,
178) {
179    if ptr != 0 {
180        unsafe {
181            let _ = Box::from_raw(ptr as *mut RiConfig);
182        }
183    }
184}
185
186#[no_mangle]
187pub extern "system" fn Java_com_dunimd_ri_RiConfig_fromYaml0(
188    mut env: JNIEnv,
189    _class: JClass,
190    yaml: JString,
191) -> jlong {
192    let yaml_str: String = match env.get_string(&yaml) {
193        Ok(s) => s.into(),
194        Err(e) => {
195            throw_ri_error(&mut env, &format!("Failed to read YAML string: {e}"));
196            return 0;
197        }
198    };
199
200    match RiConfig::from_yaml_str(&yaml_str) {
201        Ok(config) => Box::into_raw(Box::new(config)) as jlong,
202        Err(e) => {
203            throw_ri_error(&mut env, &e.to_string());
204            0
205        }
206    }
207}
208
209#[no_mangle]
210pub extern "system" fn Java_com_dunimd_ri_RiConfig_get0(
211    mut env: JNIEnv,
212    _class: JClass,
213    ptr: jlong,
214    key: JString,
215) -> jstring {
216    if !check_not_null(&mut env, ptr, "RiConfig") {
217        return std::ptr::null_mut();
218    }
219
220    let config = unsafe { &*(ptr as *const RiConfig) };
221    let key_str: String = match env.get_string(&key) {
222        Ok(s) => s.into(),
223        Err(e) => {
224            throw_ri_error(&mut env, &format!("Failed to read key: {e}"));
225            return std::ptr::null_mut();
226        }
227    };
228
229    match config.get(&key_str) {
230        Some(value) => match env.new_string(value) {
231            Ok(s) => s.into_raw(),
232            Err(_) => std::ptr::null_mut(),
233        },
234        None => std::ptr::null_mut(),
235    }
236}
237
238// =============================================================================
239// RiError JNI Bindings
240// =============================================================================
241
242#[no_mangle]
243pub extern "system" fn Java_com_dunimd_ri_RiError_getMessage(
244    mut env: JNIEnv,
245    _class: JClass,
246    ptr: jlong,
247) -> jstring {
248    if !check_not_null(&mut env, ptr, "RiError") {
249        return std::ptr::null_mut();
250    }
251    
252    let error = unsafe { &*(ptr as *const RiError) };
253    match env.new_string(error.to_string()) {
254        Ok(s) => s.into_raw(),
255        Err(_) => std::ptr::null_mut(),
256    }
257}
258
259#[no_mangle]
260pub extern "system" fn Java_com_dunimd_ri_RiError_free0(
261    _env: JNIEnv,
262    _class: JClass,
263    ptr: jlong,
264) {
265    if ptr != 0 {
266        unsafe {
267            let _ = Box::from_raw(ptr as *mut RiError);
268        }
269    }
270}
271
272// =============================================================================
273// RiServiceContext JNI Bindings
274// =============================================================================
275
276#[no_mangle]
277pub extern "system" fn Java_com_dunimd_ri_RiServiceContext_new0(
278    mut env: JNIEnv,
279    _class: JClass,
280) -> jlong {
281    match RiServiceContext::new_default() {
282        Ok(ctx) => {
283            let boxed = Box::new(ctx);
284            Box::into_raw(boxed) as jlong
285        }
286        Err(e) => {
287            throw_ri_error(&mut env, &e.to_string());
288            0
289        }
290    }
291}
292
293#[no_mangle]
294pub extern "system" fn Java_com_dunimd_ri_RiServiceContext_logger0(
295    mut env: JNIEnv,
296    _class: JClass,
297    ptr: jlong,
298) -> jlong {
299    if !check_not_null(&mut env, ptr, "RiServiceContext") {
300        return 0;
301    }
302    
303    let ctx = unsafe { &*(ptr as *const RiServiceContext) };
304    let logger = ctx.logger().clone();
305    let boxed = Box::new(logger);
306    Box::into_raw(boxed) as jlong
307}
308
309#[no_mangle]
310pub extern "system" fn Java_com_dunimd_ri_RiServiceContext_config0(
311    mut env: JNIEnv,
312    _class: JClass,
313    ptr: jlong,
314) -> jlong {
315    if !check_not_null(&mut env, ptr, "RiServiceContext") {
316        return 0;
317    }
318    
319    let ctx = unsafe { &*(ptr as *const RiServiceContext) };
320    let config_manager = ctx.config();
321    let config = (*config_manager).config().clone();
322    let boxed = Box::new(config);
323    Box::into_raw(boxed) as jlong
324}
325
326#[no_mangle]
327pub extern "system" fn Java_com_dunimd_ri_RiServiceContext_fs0(
328    mut env: JNIEnv,
329    _class: JClass,
330    ptr: jlong,
331) -> jlong {
332    if !check_not_null(&mut env, ptr, "RiServiceContext") {
333        return 0;
334    }
335    
336    let ctx = unsafe { &*(ptr as *const RiServiceContext) };
337    let fs = ctx.fs().clone();
338    let boxed = Box::new(fs);
339    Box::into_raw(boxed) as jlong
340}
341
342#[no_mangle]
343pub extern "system" fn Java_com_dunimd_ri_RiServiceContext_hooks0(
344    mut env: JNIEnv,
345    _class: JClass,
346    ptr: jlong,
347) -> jlong {
348    if !check_not_null(&mut env, ptr, "RiServiceContext") {
349        return 0;
350    }
351    
352    let ctx = unsafe { &*(ptr as *const RiServiceContext) };
353    // Return a raw pointer to the RiHookBus owned by an Arc that the context
354    // itself keeps alive. This avoids requiring Clone on RiHookBus.
355    Arc::into_raw(ctx.hooks()) as jlong
356}
357
358#[no_mangle]
359pub extern "system" fn Java_com_dunimd_ri_RiServiceContext_free0(
360    _env: JNIEnv,
361    _class: JClass,
362    ptr: jlong,
363) {
364    if ptr != 0 {
365        unsafe {
366            let _ = Box::from_raw(ptr as *mut RiServiceContext);
367        }
368    }
369}
370
371// =============================================================================
372// RiHealthCheckResult JNI Bindings
373// =============================================================================
374
375#[no_mangle]
376pub extern "system" fn Java_com_dunimd_ri_RiHealthCheckResult_new0(
377    mut env: JNIEnv,
378    _class: JClass,
379    name: JString,
380    status: jint,
381    message: JString,
382) -> jlong {
383    let name_str: String = match env.get_string(&name) {
384        Ok(s) => s.into(),
385        Err(e) => {
386            throw_ri_error(&mut env, &format!("Failed to read name: {e}"));
387            return 0;
388        }
389    };
390
391    let health_status = match status {
392        0 => RiHealthStatus::Healthy,
393        1 => RiHealthStatus::Degraded,
394        2 => RiHealthStatus::Unhealthy,
395        _ => RiHealthStatus::Unknown,
396    };
397
398    let message_str: Option<String> = if message.is_null() {
399        None
400    } else {
401        match env.get_string(&message) {
402            Ok(s) => Some(s.into()),
403            Err(e) => {
404                throw_ri_error(&mut env, &format!("Failed to read message: {e}"));
405                return 0;
406            }
407        }
408    };
409    
410    let result = RiHealthCheckResult {
411        name: name_str,
412        status: health_status,
413        message: message_str,
414        timestamp: std::time::SystemTime::now(),
415        duration: Duration::ZERO,
416    };
417    
418    let boxed = Box::new(result);
419    Box::into_raw(boxed) as jlong
420}
421
422#[no_mangle]
423pub extern "system" fn Java_com_dunimd_ri_RiHealthCheckResult_getName0(
424    mut env: JNIEnv,
425    _class: JClass,
426    ptr: jlong,
427) -> jstring {
428    if !check_not_null(&mut env, ptr, "RiHealthCheckResult") {
429        return std::ptr::null_mut();
430    }
431    
432    let result = unsafe { &*(ptr as *const RiHealthCheckResult) };
433    match env.new_string(&result.name) {
434        Ok(s) => s.into_raw(),
435        Err(_) => std::ptr::null_mut(),
436    }
437}
438
439#[no_mangle]
440pub extern "system" fn Java_com_dunimd_ri_RiHealthCheckResult_getStatus0(
441    mut env: JNIEnv,
442    _class: JClass,
443    ptr: jlong,
444) -> jint {
445    if !check_not_null(&mut env, ptr, "RiHealthCheckResult") {
446        return 3;
447    }
448    
449    let result = unsafe { &*(ptr as *const RiHealthCheckResult) };
450    match result.status {
451        RiHealthStatus::Healthy => 0,
452        RiHealthStatus::Degraded => 1,
453        RiHealthStatus::Unhealthy => 2,
454        RiHealthStatus::Unknown => 3,
455    }
456}
457
458#[no_mangle]
459pub extern "system" fn Java_com_dunimd_ri_RiHealthCheckResult_getMessage0(
460    mut env: JNIEnv,
461    _class: JClass,
462    ptr: jlong,
463) -> jstring {
464    if !check_not_null(&mut env, ptr, "RiHealthCheckResult") {
465        return std::ptr::null_mut();
466    }
467    
468    let result = unsafe { &*(ptr as *const RiHealthCheckResult) };
469    match &result.message {
470        Some(msg) => match env.new_string(msg) {
471            Ok(s) => s.into_raw(),
472            Err(_) => std::ptr::null_mut(),
473        },
474        None => std::ptr::null_mut(),
475    }
476}
477
478#[no_mangle]
479pub extern "system" fn Java_com_dunimd_ri_RiHealthCheckResult_free0(
480    _env: JNIEnv,
481    _class: JClass,
482    ptr: jlong,
483) {
484    if ptr != 0 {
485        unsafe {
486            let _ = Box::from_raw(ptr as *mut RiHealthCheckResult);
487        }
488    }
489}
490
491// =============================================================================
492// RiHealthCheckConfig JNI Bindings
493// =============================================================================
494
495#[no_mangle]
496pub extern "system" fn Java_com_dunimd_ri_RiHealthCheckConfig_new0(
497    _env: JNIEnv,
498    _class: JClass,
499) -> jlong {
500    let config = Box::new(RiHealthCheckConfig::default());
501    Box::into_raw(config) as jlong
502}
503
504#[no_mangle]
505pub extern "system" fn Java_com_dunimd_ri_RiHealthCheckConfig_newWithValues0(
506    _env: JNIEnv,
507    _class: JClass,
508    check_interval: jlong,
509    timeout: jlong,
510    failure_threshold: jint,
511    success_threshold: jint,
512    enabled: jboolean,
513) -> jlong {
514    let config = Box::new(RiHealthCheckConfig {
515        check_interval: Duration::from_secs(check_interval as u64),
516        timeout: Duration::from_secs(timeout as u64),
517        failure_threshold: failure_threshold as u32,
518        success_threshold: success_threshold as u32,
519        enabled: enabled != 0,
520    });
521    Box::into_raw(config) as jlong
522}
523
524#[no_mangle]
525pub extern "system" fn Java_com_dunimd_ri_RiHealthCheckConfig_getCheckInterval0(
526    mut env: JNIEnv,
527    _class: JClass,
528    ptr: jlong,
529) -> jlong {
530    if !check_not_null(&mut env, ptr, "RiHealthCheckConfig") {
531        return 0;
532    }
533    
534    let config = unsafe { &*(ptr as *const RiHealthCheckConfig) };
535    config.check_interval.as_secs() as jlong
536}
537
538#[no_mangle]
539pub extern "system" fn Java_com_dunimd_ri_RiHealthCheckConfig_setCheckInterval0(
540    mut env: JNIEnv,
541    _class: JClass,
542    ptr: jlong,
543    value: jlong,
544) {
545    if !check_not_null(&mut env, ptr, "RiHealthCheckConfig") {
546        return;
547    }
548    
549    let config = unsafe { &mut *(ptr as *mut RiHealthCheckConfig) };
550    config.check_interval = Duration::from_secs(value as u64);
551}
552
553#[no_mangle]
554pub extern "system" fn Java_com_dunimd_ri_RiHealthCheckConfig_getTimeout0(
555    mut env: JNIEnv,
556    _class: JClass,
557    ptr: jlong,
558) -> jlong {
559    if !check_not_null(&mut env, ptr, "RiHealthCheckConfig") {
560        return 0;
561    }
562    
563    let config = unsafe { &*(ptr as *const RiHealthCheckConfig) };
564    config.timeout.as_secs() as jlong
565}
566
567#[no_mangle]
568pub extern "system" fn Java_com_dunimd_ri_RiHealthCheckConfig_setTimeout0(
569    mut env: JNIEnv,
570    _class: JClass,
571    ptr: jlong,
572    value: jlong,
573) {
574    if !check_not_null(&mut env, ptr, "RiHealthCheckConfig") {
575        return;
576    }
577    
578    let config = unsafe { &mut *(ptr as *mut RiHealthCheckConfig) };
579    config.timeout = Duration::from_secs(value as u64);
580}
581
582#[no_mangle]
583pub extern "system" fn Java_com_dunimd_ri_RiHealthCheckConfig_getFailureThreshold0(
584    mut env: JNIEnv,
585    _class: JClass,
586    ptr: jlong,
587) -> jint {
588    if !check_not_null(&mut env, ptr, "RiHealthCheckConfig") {
589        return 0;
590    }
591    
592    let config = unsafe { &*(ptr as *const RiHealthCheckConfig) };
593    config.failure_threshold as jint
594}
595
596#[no_mangle]
597pub extern "system" fn Java_com_dunimd_ri_RiHealthCheckConfig_getSuccessThreshold0(
598    mut env: JNIEnv,
599    _class: JClass,
600    ptr: jlong,
601) -> jint {
602    if !check_not_null(&mut env, ptr, "RiHealthCheckConfig") {
603        return 0;
604    }
605    
606    let config = unsafe { &*(ptr as *const RiHealthCheckConfig) };
607    config.success_threshold as jint
608}
609
610#[no_mangle]
611pub extern "system" fn Java_com_dunimd_ri_RiHealthCheckConfig_isEnabled0(
612    mut env: JNIEnv,
613    _class: JClass,
614    ptr: jlong,
615) -> jboolean {
616    if !check_not_null(&mut env, ptr, "RiHealthCheckConfig") {
617        return 0;
618    }
619    
620    let config = unsafe { &*(ptr as *const RiHealthCheckConfig) };
621    if config.enabled { 1 } else { 0 }
622}
623
624#[no_mangle]
625pub extern "system" fn Java_com_dunimd_ri_RiHealthCheckConfig_free0(
626    _env: JNIEnv,
627    _class: JClass,
628    ptr: jlong,
629) {
630    if ptr != 0 {
631        unsafe {
632            let _ = Box::from_raw(ptr as *mut RiHealthCheckConfig);
633        }
634    }
635}
636
637// =============================================================================
638// RiHealthReport JNI Bindings
639// =============================================================================
640
641#[no_mangle]
642pub extern "system" fn Java_com_dunimd_ri_RiHealthReport_new0(
643    _env: JNIEnv,
644    _class: JClass,
645) -> jlong {
646    let report = Box::new(RiHealthReport::new());
647    Box::into_raw(report) as jlong
648}
649
650#[no_mangle]
651pub extern "system" fn Java_com_dunimd_ri_RiHealthReport_getOverallStatus0(
652    mut env: JNIEnv,
653    _class: JClass,
654    ptr: jlong,
655) -> jint {
656    if !check_not_null(&mut env, ptr, "RiHealthReport") {
657        return 3;
658    }
659    
660    let report = unsafe { &*(ptr as *const RiHealthReport) };
661    match report.overall_status {
662        RiHealthStatus::Healthy => 0,
663        RiHealthStatus::Degraded => 1,
664        RiHealthStatus::Unhealthy => 2,
665        RiHealthStatus::Unknown => 3,
666    }
667}
668
669#[no_mangle]
670pub extern "system" fn Java_com_dunimd_ri_RiHealthReport_getTotalComponents0(
671    mut env: JNIEnv,
672    _class: JClass,
673    ptr: jlong,
674) -> jint {
675    if !check_not_null(&mut env, ptr, "RiHealthReport") {
676        return 0;
677    }
678    
679    let report = unsafe { &*(ptr as *const RiHealthReport) };
680    report.total_components as jint
681}
682
683#[no_mangle]
684pub extern "system" fn Java_com_dunimd_ri_RiHealthReport_getHealthyCount0(
685    mut env: JNIEnv,
686    _class: JClass,
687    ptr: jlong,
688) -> jint {
689    if !check_not_null(&mut env, ptr, "RiHealthReport") {
690        return 0;
691    }
692    
693    let report = unsafe { &*(ptr as *const RiHealthReport) };
694    report.healthy_count as jint
695}
696
697#[no_mangle]
698pub extern "system" fn Java_com_dunimd_ri_RiHealthReport_getDegradedCount0(
699    mut env: JNIEnv,
700    _class: JClass,
701    ptr: jlong,
702) -> jint {
703    if !check_not_null(&mut env, ptr, "RiHealthReport") {
704        return 0;
705    }
706    
707    let report = unsafe { &*(ptr as *const RiHealthReport) };
708    report.degraded_count as jint
709}
710
711#[no_mangle]
712pub extern "system" fn Java_com_dunimd_ri_RiHealthReport_getUnhealthyCount0(
713    mut env: JNIEnv,
714    _class: JClass,
715    ptr: jlong,
716) -> jint {
717    if !check_not_null(&mut env, ptr, "RiHealthReport") {
718        return 0;
719    }
720    
721    let report = unsafe { &*(ptr as *const RiHealthReport) };
722    report.unhealthy_count as jint
723}
724
725#[no_mangle]
726pub extern "system" fn Java_com_dunimd_ri_RiHealthReport_getUnknownCount0(
727    mut env: JNIEnv,
728    _class: JClass,
729    ptr: jlong,
730) -> jint {
731    if !check_not_null(&mut env, ptr, "RiHealthReport") {
732        return 0;
733    }
734    
735    let report = unsafe { &*(ptr as *const RiHealthReport) };
736    report.unknown_count as jint
737}
738
739#[no_mangle]
740pub extern "system" fn Java_com_dunimd_ri_RiHealthReport_free0(
741    _env: JNIEnv,
742    _class: JClass,
743    ptr: jlong,
744) {
745    if ptr != 0 {
746        unsafe {
747            let _ = Box::from_raw(ptr as *mut RiHealthReport);
748        }
749    }
750}
751
752// =============================================================================
753// RiHealthChecker JNI Bindings
754// =============================================================================
755
756#[no_mangle]
757pub extern "system" fn Java_com_dunimd_ri_RiHealthChecker_new0(
758    _env: JNIEnv,
759    _class: JClass,
760) -> jlong {
761    let checker = Box::new(RiHealthChecker::new());
762    Box::into_raw(checker) as jlong
763}
764
765#[no_mangle]
766pub extern "system" fn Java_com_dunimd_ri_RiHealthChecker_withConfig0(
767    mut env: JNIEnv,
768    _class: JClass,
769    config_ptr: jlong,
770) -> jlong {
771    if !check_not_null(&mut env, config_ptr, "RiHealthCheckConfig") {
772        return 0;
773    }
774    
775    let config = unsafe { &*(config_ptr as *const RiHealthCheckConfig) };
776    let checker = Box::new(RiHealthChecker::with_config(config.clone()));
777    Box::into_raw(checker) as jlong
778}
779
780#[no_mangle]
781pub extern "system" fn Java_com_dunimd_ri_RiHealthChecker_getCheckCount0(
782    mut env: JNIEnv,
783    _class: JClass,
784    ptr: jlong,
785) -> jint {
786    if !check_not_null(&mut env, ptr, "RiHealthChecker") {
787        return 0;
788    }
789    
790    let checker = unsafe { &*(ptr as *const RiHealthChecker) };
791    checker.check_count() as jint
792}
793
794#[no_mangle]
795pub extern "system" fn Java_com_dunimd_ri_RiHealthChecker_free0(
796    _env: JNIEnv,
797    _class: JClass,
798    ptr: jlong,
799) {
800    if ptr != 0 {
801        unsafe {
802            let _ = Box::from_raw(ptr as *mut RiHealthChecker);
803        }
804    }
805}
806
807// =============================================================================
808// RiErrorChain JNI Bindings
809// =============================================================================
810
811#[no_mangle]
812pub extern "system" fn Java_com_dunimd_ri_RiErrorChain_new0(
813    mut env: JNIEnv,
814    _class: JClass,
815    message: JString,
816) -> jlong {
817    let msg: String = match env.get_string(&message) {
818        Ok(s) => s.into(),
819        Err(e) => {
820            throw_ri_error(&mut env, &format!("Failed to read message: {e}"));
821            return 0;
822        }
823    };
824
825    let error = std::io::Error::other(msg);
826    let chain = Box::new(RiErrorChain::new(error));
827    Box::into_raw(chain) as jlong
828}
829
830#[no_mangle]
831pub extern "system" fn Java_com_dunimd_ri_RiErrorChain_withContext0(
832    mut env: JNIEnv,
833    _class: JClass,
834    message: JString,
835    context: JString,
836) -> jlong {
837    let msg: String = match env.get_string(&message) {
838        Ok(s) => s.into(),
839        Err(e) => {
840            throw_ri_error(&mut env, &format!("Failed to read message: {e}"));
841            return 0;
842        }
843    };
844    let ctx: String = match env.get_string(&context) {
845        Ok(s) => s.into(),
846        Err(e) => {
847            throw_ri_error(&mut env, &format!("Failed to read context: {e}"));
848            return 0;
849        }
850    };
851
852    let error = std::io::Error::other(msg);
853    let chain = Box::new(RiErrorChain::with_context(error, ctx));
854    Box::into_raw(chain) as jlong
855}
856
857#[no_mangle]
858pub extern "system" fn Java_com_dunimd_ri_RiErrorChain_getContext0(
859    mut env: JNIEnv,
860    _class: JClass,
861    ptr: jlong,
862) -> jstring {
863    if !check_not_null(&mut env, ptr, "RiErrorChain") {
864        return std::ptr::null_mut();
865    }
866    
867    let chain = unsafe { &*(ptr as *const RiErrorChain) };
868    match env.new_string(chain.get_context()) {
869        Ok(s) => s.into_raw(),
870        Err(_) => std::ptr::null_mut(),
871    }
872}
873
874#[no_mangle]
875pub extern "system" fn Java_com_dunimd_ri_RiErrorChain_getSourceError0(
876    mut env: JNIEnv,
877    _class: JClass,
878    ptr: jlong,
879) -> jstring {
880    if !check_not_null(&mut env, ptr, "RiErrorChain") {
881        return std::ptr::null_mut();
882    }
883    
884    let chain = unsafe { &*(ptr as *const RiErrorChain) };
885    match env.new_string(chain.source_error().to_string()) {
886        Ok(s) => s.into_raw(),
887        Err(_) => std::ptr::null_mut(),
888    }
889}
890
891#[no_mangle]
892pub extern "system" fn Java_com_dunimd_ri_RiErrorChain_prettyFormat0(
893    mut env: JNIEnv,
894    _class: JClass,
895    ptr: jlong,
896) -> jstring {
897    if !check_not_null(&mut env, ptr, "RiErrorChain") {
898        return std::ptr::null_mut();
899    }
900    
901    let chain = unsafe { &*(ptr as *const RiErrorChain) };
902    match env.new_string(chain.pretty_format()) {
903        Ok(s) => s.into_raw(),
904        Err(_) => std::ptr::null_mut(),
905    }
906}
907
908#[no_mangle]
909pub extern "system" fn Java_com_dunimd_ri_RiErrorChain_free0(
910    _env: JNIEnv,
911    _class: JClass,
912    ptr: jlong,
913) {
914    if ptr != 0 {
915        unsafe {
916            let _ = Box::from_raw(ptr as *mut RiErrorChain);
917        }
918    }
919}
920
921// =============================================================================
922// RiErrorContext JNI Bindings
923// =============================================================================
924
925#[no_mangle]
926pub extern "system" fn Java_com_dunimd_ri_RiErrorContext_new0(
927    _env: JNIEnv,
928    _class: JClass,
929) -> jlong {
930    0
931}
932
933#[no_mangle]
934pub extern "system" fn Java_com_dunimd_ri_RiErrorContext_chainFromMsg0(
935    mut env: JNIEnv,
936    _class: JClass,
937    message: JString,
938) -> jlong {
939    let msg: String = match env.get_string(&message) {
940        Ok(s) => s.into(),
941        Err(e) => {
942            throw_ri_error(&mut env, &format!("Failed to read message: {e}"));
943            return 0;
944        }
945    };
946
947    let error = std::io::Error::other(msg);
948    let chain = Box::new(RiErrorChain::new(error));
949    Box::into_raw(chain) as jlong
950}
951
952#[no_mangle]
953pub extern "system" fn Java_com_dunimd_ri_RiErrorContext_free0(
954    _env: JNIEnv,
955    _class: JClass,
956    _ptr: jlong,
957) {
958}
959
960// =============================================================================
961// RiLockError JNI Bindings
962// =============================================================================
963
964#[no_mangle]
965pub extern "system" fn Java_com_dunimd_ri_RiLockError_new0(
966    mut env: JNIEnv,
967    _class: JClass,
968    context: JString,
969) -> jlong {
970    let ctx: String = match env.get_string(&context) {
971        Ok(s) => s.into(),
972        Err(e) => {
973            throw_ri_error(&mut env, &format!("Failed to read context: {e}"));
974            return 0;
975        }
976    };
977
978    let error = Box::new(RiLockError::new(&ctx));
979    Box::into_raw(error) as jlong
980}
981
982#[no_mangle]
983pub extern "system" fn Java_com_dunimd_ri_RiLockError_newWithPoisoned0(
984    mut env: JNIEnv,
985    _class: JClass,
986    context: JString,
987    is_poisoned: jboolean,
988) -> jlong {
989    let ctx: String = match env.get_string(&context) {
990        Ok(s) => s.into(),
991        Err(e) => {
992            throw_ri_error(&mut env, &format!("Failed to read context: {e}"));
993            return 0;
994        }
995    };
996
997    let error = if is_poisoned != 0 {
998        Box::new(RiLockError::poisoned(&ctx))
999    } else {
1000        Box::new(RiLockError::new(&ctx))
1001    };
1002    Box::into_raw(error) as jlong
1003}
1004
1005#[no_mangle]
1006pub extern "system" fn Java_com_dunimd_ri_RiLockError_poisoned0(
1007    mut env: JNIEnv,
1008    _class: JClass,
1009    context: JString,
1010) -> jlong {
1011    let ctx: String = match env.get_string(&context) {
1012        Ok(s) => s.into(),
1013        Err(e) => {
1014            throw_ri_error(&mut env, &format!("Failed to read context: {e}"));
1015            return 0;
1016        }
1017    };
1018
1019    let error = Box::new(RiLockError::poisoned(&ctx));
1020    Box::into_raw(error) as jlong
1021}
1022
1023#[no_mangle]
1024pub extern "system" fn Java_com_dunimd_ri_RiLockError_getContext0(
1025    mut env: JNIEnv,
1026    _class: JClass,
1027    ptr: jlong,
1028) -> jstring {
1029    if !check_not_null(&mut env, ptr, "RiLockError") {
1030        return std::ptr::null_mut();
1031    }
1032    
1033    let error = unsafe { &*(ptr as *const RiLockError) };
1034    match env.new_string(error.get_context()) {
1035        Ok(s) => s.into_raw(),
1036        Err(_) => std::ptr::null_mut(),
1037    }
1038}
1039
1040#[no_mangle]
1041pub extern "system" fn Java_com_dunimd_ri_RiLockError_isPoisoned0(
1042    mut env: JNIEnv,
1043    _class: JClass,
1044    ptr: jlong,
1045) -> jboolean {
1046    if !check_not_null(&mut env, ptr, "RiLockError") {
1047        return 0;
1048    }
1049    
1050    let error = unsafe { &*(ptr as *const RiLockError) };
1051    if error.is_poisoned() { 1 } else { 0 }
1052}
1053
1054#[no_mangle]
1055pub extern "system" fn Java_com_dunimd_ri_RiLockError_getMessage0(
1056    mut env: JNIEnv,
1057    _class: JClass,
1058    ptr: jlong,
1059) -> jstring {
1060    if !check_not_null(&mut env, ptr, "RiLockError") {
1061        return std::ptr::null_mut();
1062    }
1063    
1064    let error = unsafe { &*(ptr as *const RiLockError) };
1065    match env.new_string(error.to_string()) {
1066        Ok(s) => s.into_raw(),
1067        Err(_) => std::ptr::null_mut(),
1068    }
1069}
1070
1071#[no_mangle]
1072pub extern "system" fn Java_com_dunimd_ri_RiLockError_free0(
1073    _env: JNIEnv,
1074    _class: JClass,
1075    ptr: jlong,
1076) {
1077    if ptr != 0 {
1078        unsafe {
1079            let _ = Box::from_raw(ptr as *mut RiLockError);
1080        }
1081    }
1082}
1083
1084// =============================================================================
1085// RiLifecycleObserver JNI Bindings
1086// =============================================================================
1087
1088#[no_mangle]
1089pub extern "system" fn Java_com_dunimd_ri_RiLifecycleObserver_new0(
1090    _env: JNIEnv,
1091    _class: JClass,
1092) -> jlong {
1093    let observer = Box::new(RiLifecycleObserver::new());
1094    Box::into_raw(observer) as jlong
1095}
1096
1097#[no_mangle]
1098pub extern "system" fn Java_com_dunimd_ri_RiLifecycleObserver_getName0(
1099    mut env: JNIEnv,
1100    _class: JClass,
1101    ptr: jlong,
1102) -> jstring {
1103    if !check_not_null(&mut env, ptr, "RiLifecycleObserver") {
1104        return std::ptr::null_mut();
1105    }
1106    
1107    let observer = unsafe { &*(ptr as *const RiLifecycleObserver) };
1108    match env.new_string(observer.name()) {
1109        Ok(s) => s.into_raw(),
1110        Err(_) => std::ptr::null_mut(),
1111    }
1112}
1113
1114#[no_mangle]
1115pub extern "system" fn Java_com_dunimd_ri_RiLifecycleObserver_isCritical0(
1116    mut env: JNIEnv,
1117    _class: JClass,
1118    ptr: jlong,
1119) -> jboolean {
1120    if !check_not_null(&mut env, ptr, "RiLifecycleObserver") {
1121        return 0;
1122    }
1123    
1124    let observer = unsafe { &*(ptr as *const RiLifecycleObserver) };
1125    if observer.is_critical() { 1 } else { 0 }
1126}
1127
1128#[no_mangle]
1129pub extern "system" fn Java_com_dunimd_ri_RiLifecycleObserver_free0(
1130    _env: JNIEnv,
1131    _class: JClass,
1132    ptr: jlong,
1133) {
1134    if ptr != 0 {
1135        unsafe {
1136            let _ = Box::from_raw(ptr as *mut RiLifecycleObserver);
1137        }
1138    }
1139}
1140
1141// =============================================================================
1142// RiLogAnalyticsModule JNI Bindings
1143// =============================================================================
1144
1145#[no_mangle]
1146pub extern "system" fn Java_com_dunimd_ri_RiLogAnalyticsModule_new0(
1147    _env: JNIEnv,
1148    _class: JClass,
1149) -> jlong {
1150    let module = Box::new(RiLogAnalyticsModule::new());
1151    Box::into_raw(module) as jlong
1152}
1153
1154#[no_mangle]
1155pub extern "system" fn Java_com_dunimd_ri_RiLogAnalyticsModule_getName0(
1156    mut env: JNIEnv,
1157    _class: JClass,
1158    ptr: jlong,
1159) -> jstring {
1160    if !check_not_null(&mut env, ptr, "RiLogAnalyticsModule") {
1161        return std::ptr::null_mut();
1162    }
1163    
1164    let module = unsafe { &*(ptr as *const RiLogAnalyticsModule) };
1165    match env.new_string(module.name()) {
1166        Ok(s) => s.into_raw(),
1167        Err(_) => std::ptr::null_mut(),
1168    }
1169}
1170
1171#[no_mangle]
1172pub extern "system" fn Java_com_dunimd_ri_RiLogAnalyticsModule_isCritical0(
1173    mut env: JNIEnv,
1174    _class: JClass,
1175    ptr: jlong,
1176) -> jboolean {
1177    if !check_not_null(&mut env, ptr, "RiLogAnalyticsModule") {
1178        return 0;
1179    }
1180    
1181    let module = unsafe { &*(ptr as *const RiLogAnalyticsModule) };
1182    if module.is_critical() { 1 } else { 0 }
1183}
1184
1185#[no_mangle]
1186pub extern "system" fn Java_com_dunimd_ri_RiLogAnalyticsModule_isEnabled0(
1187    mut env: JNIEnv,
1188    _class: JClass,
1189    ptr: jlong,
1190) -> jboolean {
1191    if !check_not_null(&mut env, ptr, "RiLogAnalyticsModule") {
1192        return 0;
1193    }
1194    
1195    let module = unsafe { &*(ptr as *const RiLogAnalyticsModule) };
1196    if module.is_enabled() { 1 } else { 0 }
1197}
1198
1199#[no_mangle]
1200pub extern "system" fn Java_com_dunimd_ri_RiLogAnalyticsModule_free0(
1201    _env: JNIEnv,
1202    _class: JClass,
1203    ptr: jlong,
1204) {
1205    if ptr != 0 {
1206        unsafe {
1207            let _ = Box::from_raw(ptr as *mut RiLogAnalyticsModule);
1208        }
1209    }
1210}