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