Skip to main content

ri/java/classes/
log.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//! # Log Module JNI Bindings
19//!
20//! JNI bindings for Ri log classes.
21
22use jni::JNIEnv;
23use jni::objects::{JClass, JString};
24use jni::sys::{jlong, jboolean, jint, jfloat};
25use crate::log::{RiLogger, RiLogConfig, RiLogLevel};
26use crate::fs::RiFileSystem;
27use crate::java::exception::check_not_null;
28
29// =============================================================================
30// RiLogger JNI Bindings
31// =============================================================================
32
33#[no_mangle]
34pub extern "system" fn Java_com_dunimd_ri_log_RiLogger_new0(
35    _env: JNIEnv,
36    _class: JClass,
37) -> jlong {
38    let config = RiLogConfig::default();
39    let fs = RiFileSystem::new_auto_root().unwrap_or_else(|_| RiFileSystem::new_with_root(std::env::current_dir().unwrap_or_default()));
40    let logger = Box::new(RiLogger::new(&config, fs));
41    Box::into_raw(logger) as jlong
42}
43
44#[no_mangle]
45pub extern "system" fn Java_com_dunimd_ri_log_RiLogger_free0(
46    _env: JNIEnv,
47    _class: JClass,
48    ptr: jlong,
49) {
50    if ptr != 0 {
51        unsafe {
52            let _ = Box::from_raw(ptr as *mut RiLogger);
53        }
54    }
55}
56
57#[no_mangle]
58pub extern "system" fn Java_com_dunimd_ri_log_RiLogger_debug0(
59    mut env: JNIEnv,
60    _class: JClass,
61    ptr: jlong,
62    target: JString,
63    message: JString,
64) {
65    if !check_not_null(&mut env, ptr, "RiLogger") {
66        return;
67    }
68    
69    let logger = unsafe { &*(ptr as *const RiLogger) };
70    let target_str: String = env.get_string(&target)
71        .expect("Failed to get target")
72        .into();
73    let message_str: String = env.get_string(&message)
74        .expect("Failed to get message")
75        .into();
76    
77    let _ = logger.debug(&target_str, &message_str);
78}
79
80#[no_mangle]
81pub extern "system" fn Java_com_dunimd_ri_log_RiLogger_info0(
82    mut env: JNIEnv,
83    _class: JClass,
84    ptr: jlong,
85    target: JString,
86    message: JString,
87) {
88    if !check_not_null(&mut env, ptr, "RiLogger") {
89        return;
90    }
91    
92    let logger = unsafe { &*(ptr as *const RiLogger) };
93    let target_str: String = env.get_string(&target)
94        .expect("Failed to get target")
95        .into();
96    let message_str: String = env.get_string(&message)
97        .expect("Failed to get message")
98        .into();
99    
100    let _ = logger.info(&target_str, &message_str);
101}
102
103#[no_mangle]
104pub extern "system" fn Java_com_dunimd_ri_log_RiLogger_warn0(
105    mut env: JNIEnv,
106    _class: JClass,
107    ptr: jlong,
108    target: JString,
109    message: JString,
110) {
111    if !check_not_null(&mut env, ptr, "RiLogger") {
112        return;
113    }
114    
115    let logger = unsafe { &*(ptr as *const RiLogger) };
116    let target_str: String = env.get_string(&target)
117        .expect("Failed to get target")
118        .into();
119    let message_str: String = env.get_string(&message)
120        .expect("Failed to get message")
121        .into();
122    
123    let _ = logger.warn(&target_str, &message_str);
124}
125
126#[no_mangle]
127pub extern "system" fn Java_com_dunimd_ri_log_RiLogger_error0(
128    mut env: JNIEnv,
129    _class: JClass,
130    ptr: jlong,
131    target: JString,
132    message: JString,
133) {
134    if !check_not_null(&mut env, ptr, "RiLogger") {
135        return;
136    }
137    
138    let logger = unsafe { &*(ptr as *const RiLogger) };
139    let target_str: String = env.get_string(&target)
140        .expect("Failed to get target")
141        .into();
142    let message_str: String = env.get_string(&message)
143        .expect("Failed to get message")
144        .into();
145    
146    let _ = logger.error(&target_str, &message_str);
147}
148
149// =============================================================================
150// RiLogConfig JNI Bindings
151// =============================================================================
152
153#[no_mangle]
154pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_new0(
155    _env: JNIEnv,
156    _class: JClass,
157) -> jlong {
158    let config = Box::new(RiLogConfig::default());
159    Box::into_raw(config) as jlong
160}
161
162#[no_mangle]
163pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_setLevel0(
164    mut env: JNIEnv,
165    _class: JClass,
166    ptr: jlong,
167    level: jint,
168) {
169    if !check_not_null(&mut env, ptr, "RiLogConfig") {
170        return;
171    }
172    
173    let config = unsafe { &mut *(ptr as *mut RiLogConfig) };
174    config.level = match level {
175        0 => RiLogLevel::Debug,
176        1 => RiLogLevel::Info,
177        2 => RiLogLevel::Warn,
178        3 => RiLogLevel::Error,
179        _ => RiLogLevel::Info,
180    };
181}
182
183#[no_mangle]
184pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_setConsoleEnabled0(
185    mut env: JNIEnv,
186    _class: JClass,
187    ptr: jlong,
188    enabled: jboolean,
189) {
190    if !check_not_null(&mut env, ptr, "RiLogConfig") {
191        return;
192    }
193    
194    let config = unsafe { &mut *(ptr as *mut RiLogConfig) };
195    config.console_enabled = enabled != 0;
196}
197
198#[no_mangle]
199pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_setFileEnabled0(
200    mut env: JNIEnv,
201    _class: JClass,
202    ptr: jlong,
203    enabled: jboolean,
204) {
205    if !check_not_null(&mut env, ptr, "RiLogConfig") {
206        return;
207    }
208    
209    let config = unsafe { &mut *(ptr as *mut RiLogConfig) };
210    config.file_enabled = enabled != 0;
211}
212
213#[no_mangle]
214pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_setSamplingDefault0(
215    mut env: JNIEnv,
216    _class: JClass,
217    ptr: jlong,
218    rate: jfloat,
219) {
220    if !check_not_null(&mut env, ptr, "RiLogConfig") {
221        return;
222    }
223    
224    let config = unsafe { &mut *(ptr as *mut RiLogConfig) };
225    config.sampling_default = rate.clamp(0.0, 1.0);
226}
227
228#[no_mangle]
229pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_setFileName0(
230    mut env: JNIEnv,
231    _class: JClass,
232    ptr: jlong,
233    file_name: JString,
234) {
235    if !check_not_null(&mut env, ptr, "RiLogConfig") {
236        return;
237    }
238    
239    let config = unsafe { &mut *(ptr as *mut RiLogConfig) };
240    config.file_name = env.get_string(&file_name)
241        .expect("Failed to get file name")
242        .into();
243}
244
245#[no_mangle]
246pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_setJsonFormat0(
247    mut env: JNIEnv,
248    _class: JClass,
249    ptr: jlong,
250    json_format: jboolean,
251) {
252    if !check_not_null(&mut env, ptr, "RiLogConfig") {
253        return;
254    }
255    
256    let config = unsafe { &mut *(ptr as *mut RiLogConfig) };
257    config.json_format = json_format != 0;
258}
259
260#[no_mangle]
261pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_setRotateWhen0(
262    mut env: JNIEnv,
263    _class: JClass,
264    ptr: jlong,
265    rotate_when: JString,
266) {
267    if !check_not_null(&mut env, ptr, "RiLogConfig") {
268        return;
269    }
270    
271    let config = unsafe { &mut *(ptr as *mut RiLogConfig) };
272    config.rotate_when = env.get_string(&rotate_when)
273        .expect("Failed to get rotate_when")
274        .into();
275}
276
277#[no_mangle]
278pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_setMaxBytes0(
279    mut env: JNIEnv,
280    _class: JClass,
281    ptr: jlong,
282    max_bytes: jlong,
283) {
284    if !check_not_null(&mut env, ptr, "RiLogConfig") {
285        return;
286    }
287    
288    let config = unsafe { &mut *(ptr as *mut RiLogConfig) };
289    config.max_bytes = max_bytes as u64;
290}
291
292#[no_mangle]
293pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_setColorBlocks0(
294    mut env: JNIEnv,
295    _class: JClass,
296    ptr: jlong,
297    color_blocks: jboolean,
298) {
299    if !check_not_null(&mut env, ptr, "RiLogConfig") {
300        return;
301    }
302    
303    let config = unsafe { &mut *(ptr as *mut RiLogConfig) };
304    config.color_blocks = color_blocks != 0;
305}
306
307#[no_mangle]
308pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_free0(
309    _env: JNIEnv,
310    _class: JClass,
311    ptr: jlong,
312) {
313    if ptr != 0 {
314        unsafe {
315            let _ = Box::from_raw(ptr as *mut RiLogConfig);
316        }
317    }
318}