1use jni::JNIEnv;
23use jni::objects::{JClass, JString, JObject, JObjectArray};
24use jni::sys::{jlong, jboolean, jint, jstring, jobjectArray, jdouble, jlongArray};
25use jni::objects::JPrimitiveArray;
26use std::collections::HashMap as FxHashMap;
27use std::time::Duration;
28
29use crate::service_mesh::{
30 RiServiceMesh, RiServiceMeshConfig, RiServiceMeshStats,
31 RiServiceEndpoint, RiServiceHealthStatus,
32 RiServiceDiscovery, RiServiceInstance, RiServiceStatus,
33 RiHealthChecker, RiHealthSummary, RiHealthStatus, RiHealthCheckType,
34 RiTrafficRoute, RiMatchCriteria, RiRouteAction, RiWeightedDestination, RiTrafficManager,
35};
36use crate::service_mesh::traffic_management::{RiRateLimitConfig, RiCircuitBreakerConfig};
37use crate::java::exception::check_not_null;
38
39#[no_mangle]
44pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceMeshConfig_new0(
45 _env: JNIEnv,
46 _class: JClass,
47) -> jlong {
48 let config = Box::new(RiServiceMeshConfig::default());
49 Box::into_raw(config) as jlong
50}
51
52#[no_mangle]
53pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceMeshConfig_free0(
54 _env: JNIEnv,
55 _class: JClass,
56 ptr: jlong,
57) {
58 if ptr != 0 {
59 unsafe {
60 let _ = Box::from_raw(ptr as *mut RiServiceMeshConfig);
61 }
62 }
63}
64
65#[no_mangle]
70pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceMesh_new0(
71 mut env: JNIEnv,
72 _class: JClass,
73 config_ptr: jlong,
74) -> jlong {
75 if !check_not_null(&mut env, config_ptr, "RiServiceMeshConfig") {
76 return 0;
77 }
78
79 let config = unsafe { &*(config_ptr as *const RiServiceMeshConfig) };
80 match RiServiceMesh::new(config.clone()) {
81 Ok(mesh) => {
82 let boxed = Box::new(mesh);
83 Box::into_raw(boxed) as jlong
84 }
85 Err(_) => 0,
86 }
87}
88
89#[no_mangle]
90pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceMesh_free0(
91 _env: JNIEnv,
92 _class: JClass,
93 ptr: jlong,
94) {
95 if ptr != 0 {
96 unsafe {
97 let _ = Box::from_raw(ptr as *mut RiServiceMesh);
98 }
99 }
100}
101
102#[no_mangle]
107pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceDiscovery_new0(
108 _env: JNIEnv,
109 _class: JClass,
110 enabled: jboolean,
111) -> jlong {
112 let discovery = Box::new(RiServiceDiscovery::new(enabled != 0));
113 Box::into_raw(discovery) as jlong
114}
115
116#[no_mangle]
117pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceDiscovery_register0(
118 mut env: JNIEnv,
119 _class: JClass,
120 ptr: jlong,
121 service_name: JString,
122 host: JString,
123 port: jint,
124 keys: JObjectArray,
125 values: JObjectArray,
126) -> jstring {
127 if !check_not_null(&mut env, ptr, "RiServiceDiscovery") {
128 return std::ptr::null_mut();
129 }
130
131 let discovery = unsafe { &*(ptr as *const RiServiceDiscovery) };
132 let service_name_str: String = match env.get_string(&service_name) {
133 Ok(s) => s.into(),
134 Err(_) => {
135 crate::java::exception::throw_ri_error(&mut env, "Failed to get service name");
136 return std::ptr::null_mut();
137 }
138 };
139 let host_str: String = match env.get_string(&host) {
140 Ok(s) => s.into(),
141 Err(_) => {
142 crate::java::exception::throw_ri_error(&mut env, "Failed to get host");
143 return std::ptr::null_mut();
144 }
145 };
146
147 let mut metadata = FxHashMap::new();
148 let len = env.get_array_length(&keys).unwrap_or(0);
149 for i in 0..len {
150 let key: JString = match env.get_object_array_element(&keys, i) {
151 Ok(e) => e,
152 Err(_) => continue,
153 }
154 .into();
155 let value: JString = match env.get_object_array_element(&values, i) {
156 Ok(e) => e,
157 Err(_) => continue,
158 }
159 .into();
160 let key_str: String = match env.get_string(&key) {
161 Ok(s) => s.into(),
162 Err(_) => {
163 crate::java::exception::throw_ri_error(&mut env, "Failed to get key string");
164 return std::ptr::null_mut();
165 }
166 };
167 let value_str: String = match env.get_string(&value) {
168 Ok(s) => s.into(),
169 Err(_) => {
170 crate::java::exception::throw_ri_error(&mut env, "Failed to get value string");
171 return std::ptr::null_mut();
172 }
173 };
174 metadata.insert(key_str, value_str);
175 }
176
177 let result = crate::java::runtime::block_on_local(&mut env, "RiServiceMesh", async {
178 discovery.register_service(&service_name_str, &host_str, port as u16, metadata).await
179 });
180
181 match result {
182 Some(Ok(instance_id)) => match env.new_string(&instance_id) {
183 Ok(s) => s.into_raw(),
184 Err(_) => std::ptr::null_mut(),
185 },
186 _ => std::ptr::null_mut(),
187 }
188}
189
190#[no_mangle]
191pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceDiscovery_deregister0(
192 mut env: JNIEnv,
193 _class: JClass,
194 ptr: jlong,
195 instance_id: JString,
196) {
197 if !check_not_null(&mut env, ptr, "RiServiceDiscovery") {
198 return;
199 }
200
201 let discovery = unsafe { &*(ptr as *const RiServiceDiscovery) };
202 let instance_id_str: String = match env.get_string(&instance_id) {
203 Ok(s) => s.into(),
204 Err(_) => {
205 crate::java::exception::throw_ri_error(&mut env, "Failed to get instance id");
206 return;
207 }
208 };
209
210 let _ = crate::java::runtime::block_on_local(&mut env, "RiServiceMesh", async {
211 discovery.deregister_service(&instance_id_str).await
212 });
213}
214
215#[no_mangle]
216pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceDiscovery_discover0(
217 mut env: JNIEnv,
218 _class: JClass,
219 ptr: jlong,
220 service_name: JString,
221) -> jlongArray {
222 if !check_not_null(&mut env, ptr, "RiServiceDiscovery") {
223 return std::ptr::null_mut();
224 }
225
226 let discovery = unsafe { &*(ptr as *const RiServiceDiscovery) };
227 let service_name_str: String = match env.get_string(&service_name) {
228 Ok(s) => s.into(),
229 Err(_) => {
230 crate::java::exception::throw_ri_error(&mut env, "Failed to get service name");
231 return std::ptr::null_mut();
232 }
233 };
234
235 let result = crate::java::runtime::block_on_local(&mut env, "RiServiceMesh", async {
236 discovery.discover_service(&service_name_str).await
237 });
238
239 match result {
240 Some(Ok(instances)) => {
241 let ptrs: Vec<jlong> = instances.iter().map(|i| {
242 let boxed = Box::new(i.clone());
243 Box::into_raw(boxed) as jlong
244 }).collect();
245
246 let array = match env.new_long_array(ptrs.len() as i32) {
247 Ok(a) => a,
248 Err(_) => { return std::ptr::null_mut(); }
249 };
250 let _ = env.set_long_array_region(&array, 0, &ptrs);
251 array.into_raw()
252 }
253 _ => std::ptr::null_mut(),
254 }
255}
256
257#[no_mangle]
258pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceDiscovery_updateHeartbeat0(
259 mut env: JNIEnv,
260 _class: JClass,
261 ptr: jlong,
262 instance_id: JString,
263) {
264 if !check_not_null(&mut env, ptr, "RiServiceDiscovery") {
265 return;
266 }
267
268 let discovery = unsafe { &*(ptr as *const RiServiceDiscovery) };
269 let instance_id_str: String = match env.get_string(&instance_id) {
270 Ok(s) => s.into(),
271 Err(_) => {
272 crate::java::exception::throw_ri_error(&mut env, "Failed to get instance id");
273 return;
274 }
275 };
276
277 let _ = crate::java::runtime::block_on_local(&mut env, "RiServiceMesh", async {
278 discovery.update_heartbeat(&instance_id_str).await
279 });
280}
281
282#[no_mangle]
283pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceDiscovery_setServiceStatus0(
284 mut env: JNIEnv,
285 _class: JClass,
286 ptr: jlong,
287 instance_id: JString,
288 status_ordinal: jint,
289) {
290 if !check_not_null(&mut env, ptr, "RiServiceDiscovery") {
291 return;
292 }
293
294 let discovery = unsafe { &*(ptr as *const RiServiceDiscovery) };
295 let instance_id_str: String = match env.get_string(&instance_id) {
296 Ok(s) => s.into(),
297 Err(_) => {
298 crate::java::exception::throw_ri_error(&mut env, "Failed to get instance id");
299 return;
300 }
301 };
302
303 let status = match status_ordinal {
304 0 => RiServiceStatus::Starting,
305 1 => RiServiceStatus::Running,
306 2 => RiServiceStatus::Stopping,
307 3 => RiServiceStatus::Stopped,
308 4 => RiServiceStatus::Unhealthy,
309 _ => RiServiceStatus::Starting,
310 };
311
312 let _ = crate::java::runtime::block_on_local(&mut env, "RiServiceMesh", async {
313 discovery.set_service_status(&instance_id_str, status).await
314 });
315}
316
317#[no_mangle]
318pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceDiscovery_getAllServices0(
319 mut env: JNIEnv,
320 _class: JClass,
321 ptr: jlong,
322) -> jobjectArray {
323 if !check_not_null(&mut env, ptr, "RiServiceDiscovery") {
324 return std::ptr::null_mut();
325 }
326
327 let discovery = unsafe { &*(ptr as *const RiServiceDiscovery) };
328
329 let result = crate::java::runtime::block_on_local(&mut env, "RiServiceMesh", async {
330 discovery.get_all_services().await
331 });
332
333 match result {
334 Some(Ok(services)) => {
335 let string_class = match env.find_class("java/lang/String") {
336 Ok(c) => c,
337 Err(_) => { return std::ptr::null_mut(); }
338 };
339 let array = match env.new_object_array(services.len() as i32, &string_class, JObject::null()) {
340 Ok(a) => a,
341 Err(_) => { return std::ptr::null_mut(); }
342 };
343
344 for (i, service) in services.iter().enumerate() {
345 let jstr = match env.new_string(service) {
346 Ok(s) => s,
347 Err(_) => continue,
348 };
349 let _ = env.set_object_array_element(&array, i as i32, &jstr);
350 }
351
352 array.into_raw()
353 }
354 _ => std::ptr::null_mut(),
355 }
356}
357
358#[no_mangle]
359pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceDiscovery_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 RiServiceDiscovery);
367 }
368 }
369}
370
371#[no_mangle]
376pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceInstance_new0(
377 mut env: JNIEnv,
378 _class: JClass,
379 id: JString,
380 service_name: JString,
381 host: JString,
382 port: jint,
383) -> jlong {
384 let id_str: String = match env.get_string(&id) {
385 Ok(s) => s.into(),
386 Err(_) => {
387 crate::java::exception::throw_ri_error(&mut env, "Failed to get id");
388 return 0;
389 }
390 };
391 let service_name_str: String = match env.get_string(&service_name) {
392 Ok(s) => s.into(),
393 Err(_) => {
394 crate::java::exception::throw_ri_error(&mut env, "Failed to get service name");
395 return 0;
396 }
397 };
398 let host_str: String = match env.get_string(&host) {
399 Ok(s) => s.into(),
400 Err(_) => {
401 crate::java::exception::throw_ri_error(&mut env, "Failed to get host");
402 return 0;
403 }
404 };
405
406 let instance = Box::new(RiServiceInstance {
407 id: id_str,
408 service_name: service_name_str,
409 host: host_str,
410 port: port as u16,
411 metadata: FxHashMap::default(),
412 registered_at: std::time::SystemTime::now(),
413 last_heartbeat: std::time::SystemTime::now(),
414 status: RiServiceStatus::Starting,
415 });
416 Box::into_raw(instance) as jlong
417}
418
419#[no_mangle]
420pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceInstance_getId0(
421 mut env: JNIEnv,
422 _class: JClass,
423 ptr: jlong,
424) -> jstring {
425 if !check_not_null(&mut env, ptr, "RiServiceInstance") {
426 return std::ptr::null_mut();
427 }
428
429 let instance = unsafe { &*(ptr as *const RiServiceInstance) };
430 match env.new_string(&instance.id) {
431 Ok(s) => s.into_raw(),
432 Err(_) => std::ptr::null_mut(),
433 }
434}
435
436#[no_mangle]
437pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceInstance_getServiceName0(
438 mut env: JNIEnv,
439 _class: JClass,
440 ptr: jlong,
441) -> jstring {
442 if !check_not_null(&mut env, ptr, "RiServiceInstance") {
443 return std::ptr::null_mut();
444 }
445
446 let instance = unsafe { &*(ptr as *const RiServiceInstance) };
447 match env.new_string(&instance.service_name) {
448 Ok(s) => s.into_raw(),
449 Err(_) => std::ptr::null_mut(),
450 }
451}
452
453#[no_mangle]
454pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceInstance_getHost0(
455 mut env: JNIEnv,
456 _class: JClass,
457 ptr: jlong,
458) -> jstring {
459 if !check_not_null(&mut env, ptr, "RiServiceInstance") {
460 return std::ptr::null_mut();
461 }
462
463 let instance = unsafe { &*(ptr as *const RiServiceInstance) };
464 match env.new_string(&instance.host) {
465 Ok(s) => s.into_raw(),
466 Err(_) => std::ptr::null_mut(),
467 }
468}
469
470#[no_mangle]
471pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceInstance_getPort0(
472 mut env: JNIEnv,
473 _class: JClass,
474 ptr: jlong,
475) -> jint {
476 if !check_not_null(&mut env, ptr, "RiServiceInstance") {
477 return 0;
478 }
479
480 let instance = unsafe { &*(ptr as *const RiServiceInstance) };
481 instance.port as jint
482}
483
484#[no_mangle]
485pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceInstance_getStatus0(
486 mut env: JNIEnv,
487 _class: JClass,
488 ptr: jlong,
489) -> jint {
490 if !check_not_null(&mut env, ptr, "RiServiceInstance") {
491 return 0;
492 }
493
494 let instance = unsafe { &*(ptr as *const RiServiceInstance) };
495 match instance.status {
496 RiServiceStatus::Starting => 0,
497 RiServiceStatus::Running => 1,
498 RiServiceStatus::Stopping => 2,
499 RiServiceStatus::Stopped => 3,
500 RiServiceStatus::Unhealthy => 4,
501 }
502}
503
504#[no_mangle]
505pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceInstance_getMetadataKeys0(
506 mut env: JNIEnv,
507 _class: JClass,
508 ptr: jlong,
509) -> jobjectArray {
510 if !check_not_null(&mut env, ptr, "RiServiceInstance") {
511 return std::ptr::null_mut();
512 }
513
514 let instance = unsafe { &*(ptr as *const RiServiceInstance) };
515 let keys: Vec<&String> = instance.metadata.keys().collect();
516
517 let string_class = match env.find_class("java/lang/String") {
518 Ok(c) => c,
519 Err(_) => { return std::ptr::null_mut(); }
520 };
521 let array = match env.new_object_array(keys.len() as i32, &string_class, JObject::null()) {
522 Ok(a) => a,
523 Err(_) => { return std::ptr::null_mut(); }
524 };
525
526 for (i, key) in keys.iter().enumerate() {
527 let jstr = match env.new_string(key) {
528 Ok(s) => s,
529 Err(_) => continue,
530 };
531 let _ = env.set_object_array_element(&array, i as i32, &jstr);
532 }
533
534 array.into_raw()
535}
536
537#[no_mangle]
538pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceInstance_getMetadataValue0(
539 mut env: JNIEnv,
540 _class: JClass,
541 ptr: jlong,
542 key: JString,
543) -> jstring {
544 if !check_not_null(&mut env, ptr, "RiServiceInstance") {
545 return std::ptr::null_mut();
546 }
547
548 let instance = unsafe { &*(ptr as *const RiServiceInstance) };
549 let key_str: String = match env.get_string(&key) {
550 Ok(s) => s.into(),
551 Err(_) => {
552 crate::java::exception::throw_ri_error(&mut env, "Failed to get key");
553 return std::ptr::null_mut();
554 }
555 };
556
557 match instance.metadata.get(&key_str) {
558 Some(value) => match env.new_string(value) {
559 Ok(s) => s.into_raw(),
560 Err(_) => std::ptr::null_mut(),
561 },
562 None => std::ptr::null_mut(),
563 }
564}
565
566#[no_mangle]
567pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceInstance_free0(
568 _env: JNIEnv,
569 _class: JClass,
570 ptr: jlong,
571) {
572 if ptr != 0 {
573 unsafe {
574 let _ = Box::from_raw(ptr as *mut RiServiceInstance);
575 }
576 }
577}
578
579#[no_mangle]
584pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceMeshStats_new0(
585 _env: JNIEnv,
586 _class: JClass,
587) -> jlong {
588 let stats = Box::new(RiServiceMeshStats {
589 total_services: 0,
590 total_endpoints: 0,
591 healthy_endpoints: 0,
592 unhealthy_endpoints: 0,
593 });
594 Box::into_raw(stats) as jlong
595}
596
597#[no_mangle]
598pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceMeshStats_getTotalServices0(
599 mut env: JNIEnv,
600 _class: JClass,
601 ptr: jlong,
602) -> jlong {
603 if !check_not_null(&mut env, ptr, "RiServiceMeshStats") {
604 return 0;
605 }
606
607 let stats = unsafe { &*(ptr as *const RiServiceMeshStats) };
608 stats.total_services as jlong
609}
610
611#[no_mangle]
612pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceMeshStats_getTotalEndpoints0(
613 mut env: JNIEnv,
614 _class: JClass,
615 ptr: jlong,
616) -> jlong {
617 if !check_not_null(&mut env, ptr, "RiServiceMeshStats") {
618 return 0;
619 }
620
621 let stats = unsafe { &*(ptr as *const RiServiceMeshStats) };
622 stats.total_endpoints as jlong
623}
624
625#[no_mangle]
626pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceMeshStats_getHealthyEndpoints0(
627 mut env: JNIEnv,
628 _class: JClass,
629 ptr: jlong,
630) -> jlong {
631 if !check_not_null(&mut env, ptr, "RiServiceMeshStats") {
632 return 0;
633 }
634
635 let stats = unsafe { &*(ptr as *const RiServiceMeshStats) };
636 stats.healthy_endpoints as jlong
637}
638
639#[no_mangle]
640pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceMeshStats_getUnhealthyEndpoints0(
641 mut env: JNIEnv,
642 _class: JClass,
643 ptr: jlong,
644) -> jlong {
645 if !check_not_null(&mut env, ptr, "RiServiceMeshStats") {
646 return 0;
647 }
648
649 let stats = unsafe { &*(ptr as *const RiServiceMeshStats) };
650 stats.unhealthy_endpoints as jlong
651}
652
653#[no_mangle]
654pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceMeshStats_free0(
655 _env: JNIEnv,
656 _class: JClass,
657 ptr: jlong,
658) {
659 if ptr != 0 {
660 unsafe {
661 let _ = Box::from_raw(ptr as *mut RiServiceMeshStats);
662 }
663 }
664}
665
666#[no_mangle]
671pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceEndpoint_new0(
672 mut env: JNIEnv,
673 _class: JClass,
674 service_name: JString,
675 endpoint: JString,
676 weight: jint,
677) -> jlong {
678 let service_name_str: String = match env.get_string(&service_name) {
679 Ok(s) => s.into(),
680 Err(_) => {
681 crate::java::exception::throw_ri_error(&mut env, "Failed to get service name");
682 return 0;
683 }
684 };
685 let endpoint_str: String = match env.get_string(&endpoint) {
686 Ok(s) => s.into(),
687 Err(_) => {
688 crate::java::exception::throw_ri_error(&mut env, "Failed to get endpoint");
689 return 0;
690 }
691 };
692
693 let endpoint = Box::new(RiServiceEndpoint {
694 service_name: service_name_str,
695 endpoint: endpoint_str,
696 weight: weight as u32,
697 metadata: FxHashMap::default(),
698 health_status: RiServiceHealthStatus::Unknown,
699 last_health_check: std::time::SystemTime::now(),
700 });
701 Box::into_raw(endpoint) as jlong
702}
703
704#[no_mangle]
705pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceEndpoint_getServiceName0(
706 mut env: JNIEnv,
707 _class: JClass,
708 ptr: jlong,
709) -> jstring {
710 if !check_not_null(&mut env, ptr, "RiServiceEndpoint") {
711 return std::ptr::null_mut();
712 }
713
714 let endpoint = unsafe { &*(ptr as *const RiServiceEndpoint) };
715 match env.new_string(&endpoint.service_name) {
716 Ok(s) => s.into_raw(),
717 Err(_) => std::ptr::null_mut(),
718 }
719}
720
721#[no_mangle]
722pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceEndpoint_getEndpoint0(
723 mut env: JNIEnv,
724 _class: JClass,
725 ptr: jlong,
726) -> jstring {
727 if !check_not_null(&mut env, ptr, "RiServiceEndpoint") {
728 return std::ptr::null_mut();
729 }
730
731 let endpoint = unsafe { &*(ptr as *const RiServiceEndpoint) };
732 match env.new_string(&endpoint.endpoint) {
733 Ok(s) => s.into_raw(),
734 Err(_) => std::ptr::null_mut(),
735 }
736}
737
738#[no_mangle]
739pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceEndpoint_getWeight0(
740 mut env: JNIEnv,
741 _class: JClass,
742 ptr: jlong,
743) -> jint {
744 if !check_not_null(&mut env, ptr, "RiServiceEndpoint") {
745 return 0;
746 }
747
748 let endpoint = unsafe { &*(ptr as *const RiServiceEndpoint) };
749 endpoint.weight as jint
750}
751
752#[no_mangle]
753pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceEndpoint_getHealthStatus0(
754 mut env: JNIEnv,
755 _class: JClass,
756 ptr: jlong,
757) -> jint {
758 if !check_not_null(&mut env, ptr, "RiServiceEndpoint") {
759 return 0;
760 }
761
762 let endpoint = unsafe { &*(ptr as *const RiServiceEndpoint) };
763 match endpoint.health_status {
764 RiServiceHealthStatus::Healthy => 0,
765 RiServiceHealthStatus::Unhealthy => 1,
766 RiServiceHealthStatus::Unknown => 2,
767 }
768}
769
770#[no_mangle]
771pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceEndpoint_getMetadataKeys0(
772 mut env: JNIEnv,
773 _class: JClass,
774 ptr: jlong,
775) -> jobjectArray {
776 if !check_not_null(&mut env, ptr, "RiServiceEndpoint") {
777 return std::ptr::null_mut();
778 }
779
780 let endpoint = unsafe { &*(ptr as *const RiServiceEndpoint) };
781 let keys: Vec<&String> = endpoint.metadata.keys().collect();
782
783 let string_class = match env.find_class("java/lang/String") {
784 Ok(c) => c,
785 Err(_) => { return std::ptr::null_mut(); }
786 };
787 let array = match env.new_object_array(keys.len() as i32, &string_class, JObject::null()) {
788 Ok(a) => a,
789 Err(_) => { return std::ptr::null_mut(); }
790 };
791
792 for (i, key) in keys.iter().enumerate() {
793 let jstr = match env.new_string(key) {
794 Ok(s) => s,
795 Err(_) => continue,
796 };
797 let _ = env.set_object_array_element(&array, i as i32, &jstr);
798 }
799
800 array.into_raw()
801}
802
803#[no_mangle]
804pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceEndpoint_getMetadataValue0(
805 mut env: JNIEnv,
806 _class: JClass,
807 ptr: jlong,
808 key: JString,
809) -> jstring {
810 if !check_not_null(&mut env, ptr, "RiServiceEndpoint") {
811 return std::ptr::null_mut();
812 }
813
814 let endpoint = unsafe { &*(ptr as *const RiServiceEndpoint) };
815 let key_str: String = match env.get_string(&key) {
816 Ok(s) => s.into(),
817 Err(_) => {
818 crate::java::exception::throw_ri_error(&mut env, "Failed to get key");
819 return std::ptr::null_mut();
820 }
821 };
822
823 match endpoint.metadata.get(&key_str) {
824 Some(value) => match env.new_string(value) {
825 Ok(s) => s.into_raw(),
826 Err(_) => std::ptr::null_mut(),
827 },
828 None => std::ptr::null_mut(),
829 }
830}
831
832#[no_mangle]
833pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiServiceEndpoint_free0(
834 _env: JNIEnv,
835 _class: JClass,
836 ptr: jlong,
837) {
838 if ptr != 0 {
839 unsafe {
840 let _ = Box::from_raw(ptr as *mut RiServiceEndpoint);
841 }
842 }
843}
844
845#[no_mangle]
850pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiHealthChecker_new0(
851 _env: JNIEnv,
852 _class: JClass,
853 check_interval_seconds: jlong,
854) -> jlong {
855 let checker = Box::new(RiHealthChecker::new(Duration::from_secs(check_interval_seconds as u64)));
856 Box::into_raw(checker) as jlong
857}
858
859#[no_mangle]
860pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiHealthChecker_startHealthCheck0(
861 mut env: JNIEnv,
862 _class: JClass,
863 ptr: jlong,
864 service_name: JString,
865 endpoint: JString,
866) {
867 if !check_not_null(&mut env, ptr, "RiHealthChecker") {
868 return;
869 }
870
871 let checker = unsafe { &*(ptr as *const RiHealthChecker) };
872 let service_name_str: String = match env.get_string(&service_name) {
873 Ok(s) => s.into(),
874 Err(_) => {
875 crate::java::exception::throw_ri_error(&mut env, "Failed to get service name");
876 return;
877 }
878 };
879 let endpoint_str: String = match env.get_string(&endpoint) {
880 Ok(s) => s.into(),
881 Err(_) => {
882 crate::java::exception::throw_ri_error(&mut env, "Failed to get endpoint");
883 return;
884 }
885 };
886
887 let _ = crate::java::runtime::block_on_local(&mut env, "RiServiceMesh", async {
888 checker.start_health_check(&service_name_str, &endpoint_str).await
889 });
890}
891
892#[no_mangle]
893pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiHealthChecker_startHealthCheckWithType0(
894 mut env: JNIEnv,
895 _class: JClass,
896 ptr: jlong,
897 service_name: JString,
898 endpoint: JString,
899 check_type_ordinal: jint,
900) {
901 if !check_not_null(&mut env, ptr, "RiHealthChecker") {
902 return;
903 }
904
905 let checker = unsafe { &*(ptr as *const RiHealthChecker) };
906 let service_name_str: String = match env.get_string(&service_name) {
907 Ok(s) => s.into(),
908 Err(_) => {
909 crate::java::exception::throw_ri_error(&mut env, "Failed to get service name");
910 return;
911 }
912 };
913 let endpoint_str: String = match env.get_string(&endpoint) {
914 Ok(s) => s.into(),
915 Err(_) => {
916 crate::java::exception::throw_ri_error(&mut env, "Failed to get endpoint");
917 return;
918 }
919 };
920
921 let check_type = match check_type_ordinal {
922 0 => RiHealthCheckType::Http,
923 1 => RiHealthCheckType::Tcp,
924 2 => RiHealthCheckType::Grpc,
925 3 => RiHealthCheckType::Custom,
926 _ => RiHealthCheckType::Http,
927 };
928
929 let _ = crate::java::runtime::block_on_local(&mut env, "RiServiceMesh", async {
930 checker.start_health_check_with_type(&service_name_str, &endpoint_str, check_type).await
931 });
932}
933
934#[no_mangle]
935pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiHealthChecker_stopHealthCheck0(
936 mut env: JNIEnv,
937 _class: JClass,
938 ptr: jlong,
939 service_name: JString,
940 endpoint: JString,
941) {
942 if !check_not_null(&mut env, ptr, "RiHealthChecker") {
943 return;
944 }
945
946 let checker = unsafe { &*(ptr as *const RiHealthChecker) };
947 let service_name_str: String = match env.get_string(&service_name) {
948 Ok(s) => s.into(),
949 Err(_) => {
950 crate::java::exception::throw_ri_error(&mut env, "Failed to get service name");
951 return;
952 }
953 };
954 let endpoint_str: String = match env.get_string(&endpoint) {
955 Ok(s) => s.into(),
956 Err(_) => {
957 crate::java::exception::throw_ri_error(&mut env, "Failed to get endpoint");
958 return;
959 }
960 };
961
962 let _ = crate::java::runtime::block_on_local(&mut env, "RiServiceMesh", async {
963 checker.stop_health_check(&service_name_str, &endpoint_str).await
964 });
965}
966
967#[no_mangle]
968pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiHealthChecker_getServiceHealthSummary0(
969 mut env: JNIEnv,
970 _class: JClass,
971 ptr: jlong,
972 service_name: JString,
973) -> jlong {
974 if !check_not_null(&mut env, ptr, "RiHealthChecker") {
975 return 0;
976 }
977
978 let checker = unsafe { &*(ptr as *const RiHealthChecker) };
979 let service_name_str: String = match env.get_string(&service_name) {
980 Ok(s) => s.into(),
981 Err(_) => {
982 crate::java::exception::throw_ri_error(&mut env, "Failed to get service name");
983 return 0;
984 }
985 };
986
987 let result = crate::java::runtime::block_on_local(&mut env, "RiServiceMesh", async {
988 checker.get_service_health_summary(&service_name_str).await
989 });
990
991 match result {
992 Some(Ok(summary)) => {
993 let boxed = Box::new(summary);
994 Box::into_raw(boxed) as jlong
995 }
996 _ => 0,
997 }
998}
999
1000#[no_mangle]
1001pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiHealthChecker_free0(
1002 _env: JNIEnv,
1003 _class: JClass,
1004 ptr: jlong,
1005) {
1006 if ptr != 0 {
1007 unsafe {
1008 let _ = Box::from_raw(ptr as *mut RiHealthChecker);
1009 }
1010 }
1011}
1012
1013#[no_mangle]
1018pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiHealthSummary_getServiceName0(
1019 mut env: JNIEnv,
1020 _class: JClass,
1021 ptr: jlong,
1022) -> jstring {
1023 if !check_not_null(&mut env, ptr, "RiHealthSummary") {
1024 return std::ptr::null_mut();
1025 }
1026
1027 let summary = unsafe { &*(ptr as *const RiHealthSummary) };
1028 match env.new_string(&summary.service_name) {
1029 Ok(s) => s.into_raw(),
1030 Err(_) => std::ptr::null_mut(),
1031 }
1032}
1033
1034#[no_mangle]
1035pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiHealthSummary_getTotalChecks0(
1036 mut env: JNIEnv,
1037 _class: JClass,
1038 ptr: jlong,
1039) -> jlong {
1040 if !check_not_null(&mut env, ptr, "RiHealthSummary") {
1041 return 0;
1042 }
1043
1044 let summary = unsafe { &*(ptr as *const RiHealthSummary) };
1045 summary.total_checks as jlong
1046}
1047
1048#[no_mangle]
1049pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiHealthSummary_getHealthyChecks0(
1050 mut env: JNIEnv,
1051 _class: JClass,
1052 ptr: jlong,
1053) -> jlong {
1054 if !check_not_null(&mut env, ptr, "RiHealthSummary") {
1055 return 0;
1056 }
1057
1058 let summary = unsafe { &*(ptr as *const RiHealthSummary) };
1059 summary.healthy_checks as jlong
1060}
1061
1062#[no_mangle]
1063pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiHealthSummary_getUnhealthyChecks0(
1064 mut env: JNIEnv,
1065 _class: JClass,
1066 ptr: jlong,
1067) -> jlong {
1068 if !check_not_null(&mut env, ptr, "RiHealthSummary") {
1069 return 0;
1070 }
1071
1072 let summary = unsafe { &*(ptr as *const RiHealthSummary) };
1073 summary.unhealthy_checks as jlong
1074}
1075
1076#[no_mangle]
1077pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiHealthSummary_getSuccessRate0(
1078 mut env: JNIEnv,
1079 _class: JClass,
1080 ptr: jlong,
1081) -> jdouble {
1082 if !check_not_null(&mut env, ptr, "RiHealthSummary") {
1083 return 0.0;
1084 }
1085
1086 let summary = unsafe { &*(ptr as *const RiHealthSummary) };
1087 summary.success_rate
1088}
1089
1090#[no_mangle]
1091pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiHealthSummary_getAverageResponseTimeMs0(
1092 mut env: JNIEnv,
1093 _class: JClass,
1094 ptr: jlong,
1095) -> jlong {
1096 if !check_not_null(&mut env, ptr, "RiHealthSummary") {
1097 return 0;
1098 }
1099
1100 let summary = unsafe { &*(ptr as *const RiHealthSummary) };
1101 summary.average_response_time.as_millis() as jlong
1102}
1103
1104#[no_mangle]
1105pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiHealthSummary_getOverallStatus0(
1106 mut env: JNIEnv,
1107 _class: JClass,
1108 ptr: jlong,
1109) -> jint {
1110 if !check_not_null(&mut env, ptr, "RiHealthSummary") {
1111 return 0;
1112 }
1113
1114 let summary = unsafe { &*(ptr as *const RiHealthSummary) };
1115 match summary.overall_status {
1116 RiHealthStatus::Healthy => 0,
1117 RiHealthStatus::Degraded => 1,
1118 RiHealthStatus::Unhealthy => 2,
1119 RiHealthStatus::Unknown => 3,
1120 }
1121}
1122
1123#[no_mangle]
1124pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiHealthSummary_free0(
1125 _env: JNIEnv,
1126 _class: JClass,
1127 ptr: jlong,
1128) {
1129 if ptr != 0 {
1130 unsafe {
1131 let _ = Box::from_raw(ptr as *mut RiHealthSummary);
1132 }
1133 }
1134}
1135
1136#[no_mangle]
1141pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiTrafficRoute_new0(
1142 mut env: JNIEnv,
1143 _class: JClass,
1144 name: JString,
1145 source_service: JString,
1146 destination_service: JString,
1147) -> jlong {
1148 let name_str: String = match env.get_string(&name) {
1149 Ok(s) => s.into(),
1150 Err(_) => {
1151 crate::java::exception::throw_ri_error(&mut env, "Failed to get name");
1152 return 0;
1153 }
1154 };
1155 let source_service_str: String = match env.get_string(&source_service) {
1156 Ok(s) => s.into(),
1157 Err(_) => {
1158 crate::java::exception::throw_ri_error(&mut env, "Failed to get source service");
1159 return 0;
1160 }
1161 };
1162 let destination_service_str: String = match env.get_string(&destination_service) {
1163 Ok(s) => s.into(),
1164 Err(_) => {
1165 crate::java::exception::throw_ri_error(&mut env, "Failed to get destination service");
1166 return 0;
1167 }
1168 };
1169
1170 let route = Box::new(RiTrafficRoute {
1171 name: name_str,
1172 source_service: source_service_str,
1173 destination_service: destination_service_str,
1174 match_criteria: RiMatchCriteria {
1175 path_prefix: None,
1176 headers: FxHashMap::default(),
1177 method: None,
1178 query_parameters: FxHashMap::default(),
1179 },
1180 route_action: RiRouteAction::Route(vec![]),
1181 retry_policy: None,
1182 timeout: None,
1183 fault_injection: None,
1184 });
1185 Box::into_raw(route) as jlong
1186}
1187
1188#[no_mangle]
1189pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiTrafficRoute_getName0(
1190 mut env: JNIEnv,
1191 _class: JClass,
1192 ptr: jlong,
1193) -> jstring {
1194 if !check_not_null(&mut env, ptr, "RiTrafficRoute") {
1195 return std::ptr::null_mut();
1196 }
1197
1198 let route = unsafe { &*(ptr as *const RiTrafficRoute) };
1199 match env.new_string(&route.name) {
1200 Ok(s) => s.into_raw(),
1201 Err(_) => std::ptr::null_mut(),
1202 }
1203}
1204
1205#[no_mangle]
1206pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiTrafficRoute_getSourceService0(
1207 mut env: JNIEnv,
1208 _class: JClass,
1209 ptr: jlong,
1210) -> jstring {
1211 if !check_not_null(&mut env, ptr, "RiTrafficRoute") {
1212 return std::ptr::null_mut();
1213 }
1214
1215 let route = unsafe { &*(ptr as *const RiTrafficRoute) };
1216 match env.new_string(&route.source_service) {
1217 Ok(s) => s.into_raw(),
1218 Err(_) => std::ptr::null_mut(),
1219 }
1220}
1221
1222#[no_mangle]
1223pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiTrafficRoute_getDestinationService0(
1224 mut env: JNIEnv,
1225 _class: JClass,
1226 ptr: jlong,
1227) -> jstring {
1228 if !check_not_null(&mut env, ptr, "RiTrafficRoute") {
1229 return std::ptr::null_mut();
1230 }
1231
1232 let route = unsafe { &*(ptr as *const RiTrafficRoute) };
1233 match env.new_string(&route.destination_service) {
1234 Ok(s) => s.into_raw(),
1235 Err(_) => std::ptr::null_mut(),
1236 }
1237}
1238
1239#[no_mangle]
1240pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiTrafficRoute_getMatchCriteria0(
1241 mut env: JNIEnv,
1242 _class: JClass,
1243 ptr: jlong,
1244) -> jlong {
1245 if !check_not_null(&mut env, ptr, "RiTrafficRoute") {
1246 return 0;
1247 }
1248
1249 let route = unsafe { &*(ptr as *const RiTrafficRoute) };
1250 let criteria = Box::new(route.match_criteria.clone());
1251 Box::into_raw(criteria) as jlong
1252}
1253
1254#[no_mangle]
1255pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiTrafficRoute_setMatchCriteria0(
1256 mut env: JNIEnv,
1257 _class: JClass,
1258 ptr: jlong,
1259 criteria_ptr: jlong,
1260) {
1261 if !check_not_null(&mut env, ptr, "RiTrafficRoute") {
1262 return;
1263 }
1264 if !check_not_null(&mut env, criteria_ptr, "RiMatchCriteria") {
1265 return;
1266 }
1267
1268 let route = unsafe { &mut *(ptr as *mut RiTrafficRoute) };
1269 let criteria = unsafe { &*(criteria_ptr as *const RiMatchCriteria) };
1270 route.match_criteria = criteria.clone();
1271}
1272
1273#[no_mangle]
1274pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiTrafficRoute_getRouteAction0(
1275 mut env: JNIEnv,
1276 _class: JClass,
1277 ptr: jlong,
1278) -> jlong {
1279 if !check_not_null(&mut env, ptr, "RiTrafficRoute") {
1280 return 0;
1281 }
1282
1283 let route = unsafe { &*(ptr as *const RiTrafficRoute) };
1284 let action = Box::new(route.route_action.clone());
1285 Box::into_raw(action) as jlong
1286}
1287
1288#[no_mangle]
1289pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiTrafficRoute_setRouteAction0(
1290 mut env: JNIEnv,
1291 _class: JClass,
1292 ptr: jlong,
1293 action_ptr: jlong,
1294) {
1295 if !check_not_null(&mut env, ptr, "RiTrafficRoute") {
1296 return;
1297 }
1298 if !check_not_null(&mut env, action_ptr, "RiRouteAction") {
1299 return;
1300 }
1301
1302 let route = unsafe { &mut *(ptr as *mut RiTrafficRoute) };
1303 let action = unsafe { &*(action_ptr as *const RiRouteAction) };
1304 route.route_action = action.clone();
1305}
1306
1307#[no_mangle]
1308pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiTrafficRoute_getTimeoutMs0(
1309 mut env: JNIEnv,
1310 _class: JClass,
1311 ptr: jlong,
1312) -> jlong {
1313 if !check_not_null(&mut env, ptr, "RiTrafficRoute") {
1314 return 0;
1315 }
1316
1317 let route = unsafe { &*(ptr as *const RiTrafficRoute) };
1318 route.timeout.map(|t| t.as_millis() as jlong).unwrap_or(0)
1319}
1320
1321#[no_mangle]
1322pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiTrafficRoute_setTimeoutMs0(
1323 mut env: JNIEnv,
1324 _class: JClass,
1325 ptr: jlong,
1326 timeout_ms: jlong,
1327) {
1328 if !check_not_null(&mut env, ptr, "RiTrafficRoute") {
1329 return;
1330 }
1331
1332 let route = unsafe { &mut *(ptr as *mut RiTrafficRoute) };
1333 route.timeout = Some(Duration::from_millis(timeout_ms as u64));
1334}
1335
1336#[no_mangle]
1337pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiTrafficRoute_getRetryAttempts0(
1338 mut env: JNIEnv,
1339 _class: JClass,
1340 ptr: jlong,
1341) -> jint {
1342 if !check_not_null(&mut env, ptr, "RiTrafficRoute") {
1343 return 0;
1344 }
1345
1346 let route = unsafe { &*(ptr as *const RiTrafficRoute) };
1347 route.retry_policy.as_ref().map(|p| p.attempts as jint).unwrap_or(0)
1348}
1349
1350#[no_mangle]
1351pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiTrafficRoute_setRetryAttempts0(
1352 mut env: JNIEnv,
1353 _class: JClass,
1354 ptr: jlong,
1355 attempts: jint,
1356) {
1357 if !check_not_null(&mut env, ptr, "RiTrafficRoute") {
1358 return;
1359 }
1360
1361 let route = unsafe { &mut *(ptr as *mut RiTrafficRoute) };
1362 if let Some(ref mut policy) = route.retry_policy {
1363 policy.attempts = attempts as u32;
1364 } else {
1365 use crate::service_mesh::traffic_management::RiRetryPolicy;
1366 route.retry_policy = Some(RiRetryPolicy {
1367 attempts: attempts as u32,
1368 per_try_timeout: Duration::from_secs(1),
1369 retry_on: vec!["5xx".to_string()],
1370 });
1371 }
1372}
1373
1374#[no_mangle]
1375pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiTrafficRoute_free0(
1376 _env: JNIEnv,
1377 _class: JClass,
1378 ptr: jlong,
1379) {
1380 if ptr != 0 {
1381 unsafe {
1382 let _ = Box::from_raw(ptr as *mut RiTrafficRoute);
1383 }
1384 }
1385}
1386
1387#[no_mangle]
1392pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiMatchCriteria_new0(
1393 _env: JNIEnv,
1394 _class: JClass,
1395) -> jlong {
1396 let criteria = Box::new(RiMatchCriteria {
1397 path_prefix: None,
1398 headers: FxHashMap::default(),
1399 method: None,
1400 query_parameters: FxHashMap::default(),
1401 });
1402 Box::into_raw(criteria) as jlong
1403}
1404
1405#[no_mangle]
1406pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiMatchCriteria_getPathPrefix0(
1407 mut env: JNIEnv,
1408 _class: JClass,
1409 ptr: jlong,
1410) -> jstring {
1411 if !check_not_null(&mut env, ptr, "RiMatchCriteria") {
1412 return std::ptr::null_mut();
1413 }
1414
1415 let criteria = unsafe { &*(ptr as *const RiMatchCriteria) };
1416 match &criteria.path_prefix {
1417 Some(prefix) => match env.new_string(prefix) {
1418 Ok(s) => s.into_raw(),
1419 Err(_) => std::ptr::null_mut(),
1420 },
1421 None => std::ptr::null_mut(),
1422 }
1423}
1424
1425#[no_mangle]
1426pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiMatchCriteria_setPathPrefix0(
1427 mut env: JNIEnv,
1428 _class: JClass,
1429 ptr: jlong,
1430 path_prefix: JString,
1431) {
1432 if !check_not_null(&mut env, ptr, "RiMatchCriteria") {
1433 return;
1434 }
1435
1436 let criteria = unsafe { &mut *(ptr as *mut RiMatchCriteria) };
1437 let prefix_str: String = match env.get_string(&path_prefix) {
1438 Ok(s) => s.into(),
1439 Err(_) => {
1440 crate::java::exception::throw_ri_error(&mut env, "Failed to get path prefix");
1441 return;
1442 }
1443 };
1444 criteria.path_prefix = Some(prefix_str);
1445}
1446
1447#[no_mangle]
1448pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiMatchCriteria_getMethod0(
1449 mut env: JNIEnv,
1450 _class: JClass,
1451 ptr: jlong,
1452) -> jstring {
1453 if !check_not_null(&mut env, ptr, "RiMatchCriteria") {
1454 return std::ptr::null_mut();
1455 }
1456
1457 let criteria = unsafe { &*(ptr as *const RiMatchCriteria) };
1458 match &criteria.method {
1459 Some(method) => match env.new_string(method) {
1460 Ok(s) => s.into_raw(),
1461 Err(_) => std::ptr::null_mut(),
1462 },
1463 None => std::ptr::null_mut(),
1464 }
1465}
1466
1467#[no_mangle]
1468pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiMatchCriteria_setMethod0(
1469 mut env: JNIEnv,
1470 _class: JClass,
1471 ptr: jlong,
1472 method: JString,
1473) {
1474 if !check_not_null(&mut env, ptr, "RiMatchCriteria") {
1475 return;
1476 }
1477
1478 let criteria = unsafe { &mut *(ptr as *mut RiMatchCriteria) };
1479 let method_str: String = match env.get_string(&method) {
1480 Ok(s) => s.into(),
1481 Err(_) => {
1482 crate::java::exception::throw_ri_error(&mut env, "Failed to get method");
1483 return;
1484 }
1485 };
1486 criteria.method = Some(method_str);
1487}
1488
1489#[no_mangle]
1490pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiMatchCriteria_getHeaderKeys0(
1491 mut env: JNIEnv,
1492 _class: JClass,
1493 ptr: jlong,
1494) -> jobjectArray {
1495 if !check_not_null(&mut env, ptr, "RiMatchCriteria") {
1496 return std::ptr::null_mut();
1497 }
1498
1499 let criteria = unsafe { &*(ptr as *const RiMatchCriteria) };
1500 let keys: Vec<&String> = criteria.headers.keys().collect();
1501
1502 let string_class = match env.find_class("java/lang/String") {
1503 Ok(c) => c,
1504 Err(_) => { return std::ptr::null_mut(); }
1505 };
1506 let array = match env.new_object_array(keys.len() as i32, &string_class, JObject::null()) {
1507 Ok(a) => a,
1508 Err(_) => { return std::ptr::null_mut(); }
1509 };
1510
1511 for (i, key) in keys.iter().enumerate() {
1512 let jstr = match env.new_string(key) {
1513 Ok(s) => s,
1514 Err(_) => continue,
1515 };
1516 let _ = env.set_object_array_element(&array, i as i32, &jstr);
1517 }
1518
1519 array.into_raw()
1520}
1521
1522#[no_mangle]
1523pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiMatchCriteria_getHeaderValue0(
1524 mut env: JNIEnv,
1525 _class: JClass,
1526 ptr: jlong,
1527 key: JString,
1528) -> jstring {
1529 if !check_not_null(&mut env, ptr, "RiMatchCriteria") {
1530 return std::ptr::null_mut();
1531 }
1532
1533 let criteria = unsafe { &*(ptr as *const RiMatchCriteria) };
1534 let key_str: String = match env.get_string(&key) {
1535 Ok(s) => s.into(),
1536 Err(_) => {
1537 crate::java::exception::throw_ri_error(&mut env, "Failed to get key");
1538 return std::ptr::null_mut();
1539 }
1540 };
1541
1542 match criteria.headers.get(&key_str) {
1543 Some(value) => match env.new_string(value) {
1544 Ok(s) => s.into_raw(),
1545 Err(_) => std::ptr::null_mut(),
1546 },
1547 None => std::ptr::null_mut(),
1548 }
1549}
1550
1551#[no_mangle]
1552pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiMatchCriteria_addHeader0(
1553 mut env: JNIEnv,
1554 _class: JClass,
1555 ptr: jlong,
1556 key: JString,
1557 value: JString,
1558) {
1559 if !check_not_null(&mut env, ptr, "RiMatchCriteria") {
1560 return;
1561 }
1562
1563 let criteria = unsafe { &mut *(ptr as *mut RiMatchCriteria) };
1564 let key_str: String = match env.get_string(&key) {
1565 Ok(s) => s.into(),
1566 Err(_) => {
1567 crate::java::exception::throw_ri_error(&mut env, "Failed to get key");
1568 return;
1569 }
1570 };
1571 let value_str: String = match env.get_string(&value) {
1572 Ok(s) => s.into(),
1573 Err(_) => {
1574 crate::java::exception::throw_ri_error(&mut env, "Failed to get value");
1575 return;
1576 }
1577 };
1578 criteria.headers.insert(key_str, value_str);
1579}
1580
1581#[no_mangle]
1582pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiMatchCriteria_getQueryParamKeys0(
1583 mut env: JNIEnv,
1584 _class: JClass,
1585 ptr: jlong,
1586) -> jobjectArray {
1587 if !check_not_null(&mut env, ptr, "RiMatchCriteria") {
1588 return std::ptr::null_mut();
1589 }
1590
1591 let criteria = unsafe { &*(ptr as *const RiMatchCriteria) };
1592 let keys: Vec<&String> = criteria.query_parameters.keys().collect();
1593
1594 let string_class = match env.find_class("java/lang/String") {
1595 Ok(c) => c,
1596 Err(_) => { return std::ptr::null_mut(); }
1597 };
1598 let array = match env.new_object_array(keys.len() as i32, &string_class, JObject::null()) {
1599 Ok(a) => a,
1600 Err(_) => { return std::ptr::null_mut(); }
1601 };
1602
1603 for (i, key) in keys.iter().enumerate() {
1604 let jstr = match env.new_string(key) {
1605 Ok(s) => s,
1606 Err(_) => continue,
1607 };
1608 let _ = env.set_object_array_element(&array, i as i32, &jstr);
1609 }
1610
1611 array.into_raw()
1612}
1613
1614#[no_mangle]
1615pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiMatchCriteria_getQueryParamValue0(
1616 mut env: JNIEnv,
1617 _class: JClass,
1618 ptr: jlong,
1619 key: JString,
1620) -> jstring {
1621 if !check_not_null(&mut env, ptr, "RiMatchCriteria") {
1622 return std::ptr::null_mut();
1623 }
1624
1625 let criteria = unsafe { &*(ptr as *const RiMatchCriteria) };
1626 let key_str: String = match env.get_string(&key) {
1627 Ok(s) => s.into(),
1628 Err(_) => {
1629 crate::java::exception::throw_ri_error(&mut env, "Failed to get key");
1630 return std::ptr::null_mut();
1631 }
1632 };
1633
1634 match criteria.query_parameters.get(&key_str) {
1635 Some(value) => match env.new_string(value) {
1636 Ok(s) => s.into_raw(),
1637 Err(_) => std::ptr::null_mut(),
1638 },
1639 None => std::ptr::null_mut(),
1640 }
1641}
1642
1643#[no_mangle]
1644pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiMatchCriteria_addQueryParameter0(
1645 mut env: JNIEnv,
1646 _class: JClass,
1647 ptr: jlong,
1648 key: JString,
1649 value: JString,
1650) {
1651 if !check_not_null(&mut env, ptr, "RiMatchCriteria") {
1652 return;
1653 }
1654
1655 let criteria = unsafe { &mut *(ptr as *mut RiMatchCriteria) };
1656 let key_str: String = match env.get_string(&key) {
1657 Ok(s) => s.into(),
1658 Err(_) => {
1659 crate::java::exception::throw_ri_error(&mut env, "Failed to get key");
1660 return;
1661 }
1662 };
1663 let value_str: String = match env.get_string(&value) {
1664 Ok(s) => s.into(),
1665 Err(_) => {
1666 crate::java::exception::throw_ri_error(&mut env, "Failed to get value");
1667 return;
1668 }
1669 };
1670 criteria.query_parameters.insert(key_str, value_str);
1671}
1672
1673#[no_mangle]
1674pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiMatchCriteria_free0(
1675 _env: JNIEnv,
1676 _class: JClass,
1677 ptr: jlong,
1678) {
1679 if ptr != 0 {
1680 unsafe {
1681 let _ = Box::from_raw(ptr as *mut RiMatchCriteria);
1682 }
1683 }
1684}
1685
1686#[no_mangle]
1691pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiRouteAction_route0(
1692 env: JNIEnv,
1693 _class: JClass,
1694 destination_ptrs: JPrimitiveArray<jlong>,
1695) -> jlong {
1696 let len = env.get_array_length(&destination_ptrs).unwrap_or(0);
1697 let mut ptrs = vec![0i64; len as usize];
1698 env.get_long_array_region(&destination_ptrs, 0, &mut ptrs).unwrap_or(());
1699
1700 let destinations: Vec<RiWeightedDestination> = ptrs.iter()
1701 .filter(|&&p| p != 0)
1702 .map(|&p| {
1703 let dest = unsafe { &*(p as *const RiWeightedDestination) };
1704 dest.clone()
1705 })
1706 .collect();
1707
1708 let action = Box::new(RiRouteAction::Route(destinations));
1709 Box::into_raw(action) as jlong
1710}
1711
1712#[no_mangle]
1713pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiRouteAction_redirect0(
1714 mut env: JNIEnv,
1715 _class: JClass,
1716 uri: JString,
1717) -> jlong {
1718 let uri_str: String = match env.get_string(&uri) {
1719 Ok(s) => s.into(),
1720 Err(_) => {
1721 crate::java::exception::throw_ri_error(&mut env, "Failed to get uri");
1722 return 0;
1723 }
1724 };
1725
1726 let action = Box::new(RiRouteAction::Redirect(uri_str));
1727 Box::into_raw(action) as jlong
1728}
1729
1730#[no_mangle]
1731pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiRouteAction_directResponse0(
1732 mut env: JNIEnv,
1733 _class: JClass,
1734 status_code: jint,
1735 body: JString,
1736) -> jlong {
1737 let body_str: String = match env.get_string(&body) {
1738 Ok(s) => s.into(),
1739 Err(_) => {
1740 crate::java::exception::throw_ri_error(&mut env, "Failed to get body");
1741 return 0;
1742 }
1743 };
1744
1745 let action = Box::new(RiRouteAction::DirectResponse(status_code as u16, body_str));
1746 Box::into_raw(action) as jlong
1747}
1748
1749#[no_mangle]
1750pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiRouteAction_getType0(
1751 mut env: JNIEnv,
1752 _class: JClass,
1753 ptr: jlong,
1754) -> jint {
1755 if !check_not_null(&mut env, ptr, "RiRouteAction") {
1756 return 0;
1757 }
1758
1759 let action = unsafe { &*(ptr as *const RiRouteAction) };
1760 match action {
1761 RiRouteAction::Route(_) => 0,
1762 RiRouteAction::Redirect(_) => 1,
1763 RiRouteAction::DirectResponse(_, _) => 2,
1764 }
1765}
1766
1767#[no_mangle]
1768pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiRouteAction_getDestinations0(
1769 mut env: JNIEnv,
1770 _class: JClass,
1771 ptr: jlong,
1772) -> jlongArray {
1773 if !check_not_null(&mut env, ptr, "RiRouteAction") {
1774 return std::ptr::null_mut();
1775 }
1776
1777 let action = unsafe { &*(ptr as *const RiRouteAction) };
1778
1779 match action {
1780 RiRouteAction::Route(destinations) => {
1781 let ptrs: Vec<jlong> = destinations.iter().map(|d| {
1782 let boxed = Box::new(d.clone());
1783 Box::into_raw(boxed) as jlong
1784 }).collect();
1785
1786 let array = match env.new_long_array(ptrs.len() as i32) {
1787 Ok(a) => a,
1788 Err(_) => { return std::ptr::null_mut(); }
1789 };
1790 let _ = env.set_long_array_region(&array, 0, &ptrs);
1791 array.into_raw()
1792 }
1793 _ => std::ptr::null_mut(),
1794 }
1795}
1796
1797#[no_mangle]
1798pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiRouteAction_getRedirectUri0(
1799 mut env: JNIEnv,
1800 _class: JClass,
1801 ptr: jlong,
1802) -> jstring {
1803 if !check_not_null(&mut env, ptr, "RiRouteAction") {
1804 return std::ptr::null_mut();
1805 }
1806
1807 let action = unsafe { &*(ptr as *const RiRouteAction) };
1808
1809 match action {
1810 RiRouteAction::Redirect(uri) => match env.new_string(uri) {
1811 Ok(s) => s.into_raw(),
1812 Err(_) => std::ptr::null_mut(),
1813 },
1814 _ => std::ptr::null_mut(),
1815 }
1816}
1817
1818#[no_mangle]
1819pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiRouteAction_getDirectResponseStatusCode0(
1820 mut env: JNIEnv,
1821 _class: JClass,
1822 ptr: jlong,
1823) -> jint {
1824 if !check_not_null(&mut env, ptr, "RiRouteAction") {
1825 return 0;
1826 }
1827
1828 let action = unsafe { &*(ptr as *const RiRouteAction) };
1829
1830 match action {
1831 RiRouteAction::DirectResponse(status_code, _) => *status_code as jint,
1832 _ => 0,
1833 }
1834}
1835
1836#[no_mangle]
1837pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiRouteAction_getDirectResponseBody0(
1838 mut env: JNIEnv,
1839 _class: JClass,
1840 ptr: jlong,
1841) -> jstring {
1842 if !check_not_null(&mut env, ptr, "RiRouteAction") {
1843 return std::ptr::null_mut();
1844 }
1845
1846 let action = unsafe { &*(ptr as *const RiRouteAction) };
1847
1848 match action {
1849 RiRouteAction::DirectResponse(_, body) => match env.new_string(body) {
1850 Ok(s) => s.into_raw(),
1851 Err(_) => std::ptr::null_mut(),
1852 },
1853 _ => std::ptr::null_mut(),
1854 }
1855}
1856
1857#[no_mangle]
1858pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiRouteAction_free0(
1859 _env: JNIEnv,
1860 _class: JClass,
1861 ptr: jlong,
1862) {
1863 if ptr != 0 {
1864 unsafe {
1865 let _ = Box::from_raw(ptr as *mut RiRouteAction);
1866 }
1867 }
1868}
1869
1870#[no_mangle]
1875pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiWeightedDestination_new0(
1876 mut env: JNIEnv,
1877 _class: JClass,
1878 service: JString,
1879 weight: jint,
1880) -> jlong {
1881 let service_str: String = match env.get_string(&service) {
1882 Ok(s) => s.into(),
1883 Err(_) => {
1884 crate::java::exception::throw_ri_error(&mut env, "Failed to get service");
1885 return 0;
1886 }
1887 };
1888
1889 let dest = Box::new(RiWeightedDestination {
1890 service: service_str,
1891 weight: weight as u32,
1892 subset: None,
1893 });
1894 Box::into_raw(dest) as jlong
1895}
1896
1897#[no_mangle]
1898pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiWeightedDestination_getService0(
1899 mut env: JNIEnv,
1900 _class: JClass,
1901 ptr: jlong,
1902) -> jstring {
1903 if !check_not_null(&mut env, ptr, "RiWeightedDestination") {
1904 return std::ptr::null_mut();
1905 }
1906
1907 let dest = unsafe { &*(ptr as *const RiWeightedDestination) };
1908 match env.new_string(&dest.service) {
1909 Ok(s) => s.into_raw(),
1910 Err(_) => std::ptr::null_mut(),
1911 }
1912}
1913
1914#[no_mangle]
1915pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiWeightedDestination_getWeight0(
1916 mut env: JNIEnv,
1917 _class: JClass,
1918 ptr: jlong,
1919) -> jint {
1920 if !check_not_null(&mut env, ptr, "RiWeightedDestination") {
1921 return 0;
1922 }
1923
1924 let dest = unsafe { &*(ptr as *const RiWeightedDestination) };
1925 dest.weight as jint
1926}
1927
1928#[no_mangle]
1929pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiWeightedDestination_getSubset0(
1930 mut env: JNIEnv,
1931 _class: JClass,
1932 ptr: jlong,
1933) -> jstring {
1934 if !check_not_null(&mut env, ptr, "RiWeightedDestination") {
1935 return std::ptr::null_mut();
1936 }
1937
1938 let dest = unsafe { &*(ptr as *const RiWeightedDestination) };
1939 match &dest.subset {
1940 Some(subset) => match env.new_string(subset) {
1941 Ok(s) => s.into_raw(),
1942 Err(_) => std::ptr::null_mut(),
1943 },
1944 None => std::ptr::null_mut(),
1945 }
1946}
1947
1948#[no_mangle]
1949pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiWeightedDestination_setSubset0(
1950 mut env: JNIEnv,
1951 _class: JClass,
1952 ptr: jlong,
1953 subset: JString,
1954) {
1955 if !check_not_null(&mut env, ptr, "RiWeightedDestination") {
1956 return;
1957 }
1958
1959 let dest = unsafe { &mut *(ptr as *mut RiWeightedDestination) };
1960 let subset_str: String = match env.get_string(&subset) {
1961 Ok(s) => s.into(),
1962 Err(_) => {
1963 crate::java::exception::throw_ri_error(&mut env, "Failed to get subset");
1964 return;
1965 }
1966 };
1967 dest.subset = Some(subset_str);
1968}
1969
1970#[no_mangle]
1971pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiWeightedDestination_free0(
1972 _env: JNIEnv,
1973 _class: JClass,
1974 ptr: jlong,
1975) {
1976 if ptr != 0 {
1977 unsafe {
1978 let _ = Box::from_raw(ptr as *mut RiWeightedDestination);
1979 }
1980 }
1981}
1982
1983#[no_mangle]
1988pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiTrafficManager_new0(
1989 _env: JNIEnv,
1990 _class: JClass,
1991 enabled: jboolean,
1992) -> jlong {
1993 let manager = Box::new(RiTrafficManager::new(enabled != 0));
1994 Box::into_raw(manager) as jlong
1995}
1996
1997#[no_mangle]
1998pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiTrafficManager_addRoute0(
1999 mut env: JNIEnv,
2000 _class: JClass,
2001 ptr: jlong,
2002 route_ptr: jlong,
2003) {
2004 if !check_not_null(&mut env, ptr, "RiTrafficManager") {
2005 return;
2006 }
2007 if !check_not_null(&mut env, route_ptr, "RiTrafficRoute") {
2008 return;
2009 }
2010
2011 let manager = unsafe { &*(ptr as *const RiTrafficManager) };
2012 let route = unsafe { &*(route_ptr as *const RiTrafficRoute) };
2013
2014 let _ = crate::java::runtime::block_on_local(&mut env, "RiServiceMesh", async {
2015 manager.add_traffic_route(route.clone()).await
2016 });
2017}
2018
2019#[no_mangle]
2020pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiTrafficManager_removeRoute0(
2021 mut env: JNIEnv,
2022 _class: JClass,
2023 ptr: jlong,
2024 source_service: JString,
2025 route_name: JString,
2026) {
2027 if !check_not_null(&mut env, ptr, "RiTrafficManager") {
2028 return;
2029 }
2030
2031 let manager = unsafe { &*(ptr as *const RiTrafficManager) };
2032 let source_service_str: String = match env.get_string(&source_service) {
2033 Ok(s) => s.into(),
2034 Err(_) => {
2035 crate::java::exception::throw_ri_error(&mut env, "Failed to get source service");
2036 return;
2037 }
2038 };
2039 let route_name_str: String = match env.get_string(&route_name) {
2040 Ok(s) => s.into(),
2041 Err(_) => {
2042 crate::java::exception::throw_ri_error(&mut env, "Failed to get route name");
2043 return;
2044 }
2045 };
2046
2047 let _ = crate::java::runtime::block_on_local(&mut env, "RiServiceMesh", async {
2048 manager.remove_traffic_route(&source_service_str, &route_name_str).await
2049 });
2050}
2051
2052#[no_mangle]
2053pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiTrafficManager_getRoutes0(
2054 mut env: JNIEnv,
2055 _class: JClass,
2056 ptr: jlong,
2057 source_service: JString,
2058) -> jlongArray {
2059 if !check_not_null(&mut env, ptr, "RiTrafficManager") {
2060 return std::ptr::null_mut();
2061 }
2062
2063 let manager = unsafe { &*(ptr as *const RiTrafficManager) };
2064 let source_service_str: String = match env.get_string(&source_service) {
2065 Ok(s) => s.into(),
2066 Err(_) => {
2067 crate::java::exception::throw_ri_error(&mut env, "Failed to get source service");
2068 return std::ptr::null_mut();
2069 }
2070 };
2071
2072 let result = crate::java::runtime::block_on_local(&mut env, "RiServiceMesh", async {
2073 manager.get_traffic_routes(&source_service_str).await
2074 });
2075
2076 match result {
2077 Some(Ok(routes)) => {
2078 let ptrs: Vec<jlong> = routes.iter().map(|r| {
2079 let boxed = Box::new(r.clone());
2080 Box::into_raw(boxed) as jlong
2081 }).collect();
2082
2083 let array = match env.new_long_array(ptrs.len() as i32) {
2084 Ok(a) => a,
2085 Err(_) => { return std::ptr::null_mut(); }
2086 };
2087 let _ = env.set_long_array_region(&array, 0, &ptrs);
2088 array.into_raw()
2089 }
2090 _ => std::ptr::null_mut(),
2091 }
2092}
2093
2094#[no_mangle]
2095pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiTrafficManager_setCircuitBreakerConfig0(
2096 mut env: JNIEnv,
2097 _class: JClass,
2098 ptr: jlong,
2099 service: JString,
2100 consecutive_errors: jint,
2101 max_ejection_percent: jdouble,
2102) {
2103 if !check_not_null(&mut env, ptr, "RiTrafficManager") {
2104 return;
2105 }
2106
2107 let manager = unsafe { &*(ptr as *const RiTrafficManager) };
2108 let service_str: String = match env.get_string(&service) {
2109 Ok(s) => s.into(),
2110 Err(_) => {
2111 crate::java::exception::throw_ri_error(&mut env, "Failed to get service");
2112 return;
2113 }
2114 };
2115
2116 let config = RiCircuitBreakerConfig {
2117 consecutive_errors: consecutive_errors as u32,
2118 interval: Duration::from_secs(10),
2119 base_ejection_time: Duration::from_secs(30),
2120 max_ejection_percent,
2121 };
2122
2123 let _ = crate::java::runtime::block_on_local(&mut env, "RiServiceMesh", async {
2124 manager.set_circuit_breaker_config(&service_str, config).await
2125 });
2126}
2127
2128#[no_mangle]
2129pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiTrafficManager_setRateLimitConfig0(
2130 mut env: JNIEnv,
2131 _class: JClass,
2132 ptr: jlong,
2133 service: JString,
2134 requests_per_second: jint,
2135 burst_size: jint,
2136) {
2137 if !check_not_null(&mut env, ptr, "RiTrafficManager") {
2138 return;
2139 }
2140
2141 let manager = unsafe { &*(ptr as *const RiTrafficManager) };
2142 let service_str: String = match env.get_string(&service) {
2143 Ok(s) => s.into(),
2144 Err(_) => {
2145 crate::java::exception::throw_ri_error(&mut env, "Failed to get service");
2146 return;
2147 }
2148 };
2149
2150 let config = RiRateLimitConfig {
2151 requests_per_second: requests_per_second as u32,
2152 burst_size: burst_size as u32,
2153 window: Duration::from_secs(1),
2154 };
2155
2156 let _ = crate::java::runtime::block_on_local(&mut env, "RiServiceMesh", async {
2157 manager.set_rate_limit_config(&service_str, config).await
2158 });
2159}
2160
2161#[no_mangle]
2162pub extern "system" fn Java_com_dunimd_ri_servicemesh_RiTrafficManager_free0(
2163 _env: JNIEnv,
2164 _class: JClass,
2165 ptr: jlong,
2166) {
2167 if ptr != 0 {
2168 unsafe {
2169 let _ = Box::from_raw(ptr as *mut RiTrafficManager);
2170 }
2171 }
2172}