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 = match env.get_string(&target) {
71        Ok(s) => s.into(),
72        Err(_) => {
73            crate::java::exception::throw_ri_error(&mut env, "Failed to get target");
74            return;
75        }
76    };
77    let message_str: String = match env.get_string(&message) {
78        Ok(s) => s.into(),
79        Err(_) => {
80            crate::java::exception::throw_ri_error(&mut env, "Failed to get message");
81            return;
82        }
83    };
84    
85    let _ = logger.debug(&target_str, &message_str);
86}
87
88#[no_mangle]
89pub extern "system" fn Java_com_dunimd_ri_log_RiLogger_info0(
90    mut env: JNIEnv,
91    _class: JClass,
92    ptr: jlong,
93    target: JString,
94    message: JString,
95) {
96    if !check_not_null(&mut env, ptr, "RiLogger") {
97        return;
98    }
99    
100    let logger = unsafe { &*(ptr as *const RiLogger) };
101    let target_str: String = match env.get_string(&target) {
102        Ok(s) => s.into(),
103        Err(_) => {
104            crate::java::exception::throw_ri_error(&mut env, "Failed to get target");
105            return;
106        }
107    };
108    let message_str: String = match env.get_string(&message) {
109        Ok(s) => s.into(),
110        Err(_) => {
111            crate::java::exception::throw_ri_error(&mut env, "Failed to get message");
112            return;
113        }
114    };
115    
116    let _ = logger.info(&target_str, &message_str);
117}
118
119#[no_mangle]
120pub extern "system" fn Java_com_dunimd_ri_log_RiLogger_warn0(
121    mut env: JNIEnv,
122    _class: JClass,
123    ptr: jlong,
124    target: JString,
125    message: JString,
126) {
127    if !check_not_null(&mut env, ptr, "RiLogger") {
128        return;
129    }
130    
131    let logger = unsafe { &*(ptr as *const RiLogger) };
132    let target_str: String = match env.get_string(&target) {
133        Ok(s) => s.into(),
134        Err(_) => {
135            crate::java::exception::throw_ri_error(&mut env, "Failed to get target");
136            return;
137        }
138    };
139    let message_str: String = match env.get_string(&message) {
140        Ok(s) => s.into(),
141        Err(_) => {
142            crate::java::exception::throw_ri_error(&mut env, "Failed to get message");
143            return;
144        }
145    };
146    
147    let _ = logger.warn(&target_str, &message_str);
148}
149
150#[no_mangle]
151pub extern "system" fn Java_com_dunimd_ri_log_RiLogger_error0(
152    mut env: JNIEnv,
153    _class: JClass,
154    ptr: jlong,
155    target: JString,
156    message: JString,
157) {
158    if !check_not_null(&mut env, ptr, "RiLogger") {
159        return;
160    }
161    
162    let logger = unsafe { &*(ptr as *const RiLogger) };
163    let target_str: String = match env.get_string(&target) {
164        Ok(s) => s.into(),
165        Err(_) => {
166            crate::java::exception::throw_ri_error(&mut env, "Failed to get target");
167            return;
168        }
169    };
170    let message_str: String = match env.get_string(&message) {
171        Ok(s) => s.into(),
172        Err(_) => {
173            crate::java::exception::throw_ri_error(&mut env, "Failed to get message");
174            return;
175        }
176    };
177    
178    let _ = logger.error(&target_str, &message_str);
179}
180
181// =============================================================================
182// RiLogConfig JNI Bindings
183// =============================================================================
184
185#[no_mangle]
186pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_new0(
187    _env: JNIEnv,
188    _class: JClass,
189) -> jlong {
190    let config = Box::new(RiLogConfig::default());
191    Box::into_raw(config) as jlong
192}
193
194#[no_mangle]
195pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_setLevel0(
196    mut env: JNIEnv,
197    _class: JClass,
198    ptr: jlong,
199    level: jint,
200) {
201    if !check_not_null(&mut env, ptr, "RiLogConfig") {
202        return;
203    }
204    
205    let config = unsafe { &mut *(ptr as *mut RiLogConfig) };
206    config.level = match level {
207        0 => RiLogLevel::Debug,
208        1 => RiLogLevel::Info,
209        2 => RiLogLevel::Warn,
210        3 => RiLogLevel::Error,
211        _ => RiLogLevel::Info,
212    };
213}
214
215#[no_mangle]
216pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_setConsoleEnabled0(
217    mut env: JNIEnv,
218    _class: JClass,
219    ptr: jlong,
220    enabled: jboolean,
221) {
222    if !check_not_null(&mut env, ptr, "RiLogConfig") {
223        return;
224    }
225    
226    let config = unsafe { &mut *(ptr as *mut RiLogConfig) };
227    config.console_enabled = enabled != 0;
228}
229
230#[no_mangle]
231pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_setFileEnabled0(
232    mut env: JNIEnv,
233    _class: JClass,
234    ptr: jlong,
235    enabled: jboolean,
236) {
237    if !check_not_null(&mut env, ptr, "RiLogConfig") {
238        return;
239    }
240    
241    let config = unsafe { &mut *(ptr as *mut RiLogConfig) };
242    config.file_enabled = enabled != 0;
243}
244
245#[no_mangle]
246pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_setSamplingDefault0(
247    mut env: JNIEnv,
248    _class: JClass,
249    ptr: jlong,
250    rate: jfloat,
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.sampling_default = rate.clamp(0.0, 1.0);
258}
259
260#[no_mangle]
261pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_setFileName0(
262    mut env: JNIEnv,
263    _class: JClass,
264    ptr: jlong,
265    file_name: 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.file_name = match env.get_string(&file_name) {
273        Ok(s) => s.into(),
274        Err(_) => {
275            crate::java::exception::throw_ri_error(&mut env, "Invalid file_name");
276            return;
277        }
278    };
279}
280
281#[no_mangle]
282pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_setJsonFormat0(
283    mut env: JNIEnv,
284    _class: JClass,
285    ptr: jlong,
286    json_format: jboolean,
287) {
288    if !check_not_null(&mut env, ptr, "RiLogConfig") {
289        return;
290    }
291    
292    let config = unsafe { &mut *(ptr as *mut RiLogConfig) };
293    config.json_format = json_format != 0;
294}
295
296#[no_mangle]
297pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_setRotateWhen0(
298    mut env: JNIEnv,
299    _class: JClass,
300    ptr: jlong,
301    rotate_when: JString,
302) {
303    if !check_not_null(&mut env, ptr, "RiLogConfig") {
304        return;
305    }
306    
307    let config = unsafe { &mut *(ptr as *mut RiLogConfig) };
308    config.rotate_when = match env.get_string(&rotate_when) {
309        Ok(s) => s.into(),
310        Err(_) => {
311            crate::java::exception::throw_ri_error(&mut env, "Invalid rotate_when");
312            return;
313        }
314    };
315}
316
317#[no_mangle]
318pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_setMaxBytes0(
319    mut env: JNIEnv,
320    _class: JClass,
321    ptr: jlong,
322    max_bytes: jlong,
323) {
324    if !check_not_null(&mut env, ptr, "RiLogConfig") {
325        return;
326    }
327    
328    let config = unsafe { &mut *(ptr as *mut RiLogConfig) };
329    config.max_bytes = max_bytes as u64;
330}
331
332#[no_mangle]
333pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_setColorBlocks0(
334    mut env: JNIEnv,
335    _class: JClass,
336    ptr: jlong,
337    color_blocks: jboolean,
338) {
339    if !check_not_null(&mut env, ptr, "RiLogConfig") {
340        return;
341    }
342    
343    let config = unsafe { &mut *(ptr as *mut RiLogConfig) };
344    config.color_blocks = color_blocks != 0;
345}
346
347#[no_mangle]
348pub extern "system" fn Java_com_dunimd_ri_log_RiLogConfig_free0(
349    _env: JNIEnv,
350    _class: JClass,
351    ptr: jlong,
352) {
353    if ptr != 0 {
354        unsafe {
355            let _ = Box::from_raw(ptr as *mut RiLogConfig);
356        }
357    }
358}