codemp/src/ffi/java/ext.rs

53 lines
1.3 KiB
Rust
Raw Normal View History

use jni::{objects::{JClass, JString}, sys::{jboolean, jlong}, JNIEnv};
use super::{JExceptable, null_check};
/// Calculate the XXH3 hash for a given String.
#[no_mangle]
pub extern "system" fn Java_mp_code_Extensions_hash<'local>(
mut env: JNIEnv,
_class: JClass<'local>,
content: JString<'local>,
) -> jlong {
null_check!(env, content, 0 as jlong);
let content: String = env.get_string(&content)
.map(|s| s.into())
.jexcept(&mut env);
let hash = crate::ext::hash(content.as_bytes());
i64::from_ne_bytes(hash.to_ne_bytes())
}
/// Tells the [tokio] runtime how to drive the event loop.
#[no_mangle]
pub extern "system" fn Java_mp_code_Extensions_drive(
_env: JNIEnv,
_class: JClass,
block: jboolean
) {
if block != 0 {
super::tokio().block_on(std::future::pending::<()>());
} else {
std::thread::spawn(|| {
super::tokio().block_on(std::future::pending::<()>());
});
}
}
/// Set up the tracing subscriber.
#[no_mangle]
#[allow(non_snake_case)]
pub extern "system" fn Java_mp_code_Extensions_setupTracing<'local>(
mut env: JNIEnv,
_class: JClass<'local>,
path: JString<'local>,
debug: jboolean
) {
super::setup_logger(
debug != 0,
Some(path)
.filter(|p| !p.is_null())
.map(|p| env.get_string(&p).map(|s| s.into())
.jexcept(&mut env))
);
}