mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-08-29 23:39:14 +00:00
9d965cae64
* Add FFI JNI JSON RPC bridge * Add FFI instance list API
92 lines
2.6 KiB
Rust
92 lines
2.6 KiB
Rust
use std::{
|
|
ffi::{CStr, c_char},
|
|
ptr,
|
|
};
|
|
|
|
use easytier_ffi::{call_json_rpc, free_string};
|
|
use jni::JNIEnv;
|
|
use jni::objects::{JClass, JString};
|
|
use jni::sys::jstring;
|
|
|
|
use crate::{
|
|
error::{get_last_error, throw_exception},
|
|
strings::{jstring_to_cstring, optional_jstring_to_cstring},
|
|
};
|
|
|
|
pub(crate) fn call_json_rpc_jni(
|
|
mut env: JNIEnv,
|
|
_class: JClass,
|
|
service_name: JString,
|
|
method_name: JString,
|
|
domain_name: JString,
|
|
payload_json: JString,
|
|
) -> jstring {
|
|
let service_name_cstr = match jstring_to_cstring(&mut env, &service_name) {
|
|
Ok(cstr) => cstr,
|
|
Err(e) => {
|
|
throw_exception(&mut env, &format!("Invalid service name: {}", e));
|
|
return ptr::null_mut();
|
|
}
|
|
};
|
|
let method_name_cstr = match jstring_to_cstring(&mut env, &method_name) {
|
|
Ok(cstr) => cstr,
|
|
Err(e) => {
|
|
throw_exception(&mut env, &format!("Invalid method name: {}", e));
|
|
return ptr::null_mut();
|
|
}
|
|
};
|
|
let domain_name_cstr = match optional_jstring_to_cstring(&mut env, &domain_name) {
|
|
Ok(cstr) => cstr,
|
|
Err(e) => {
|
|
throw_exception(&mut env, &format!("Invalid domain name: {}", e));
|
|
return ptr::null_mut();
|
|
}
|
|
};
|
|
let payload_json_cstr = match jstring_to_cstring(&mut env, &payload_json) {
|
|
Ok(cstr) => cstr,
|
|
Err(e) => {
|
|
throw_exception(&mut env, &format!("Invalid payload JSON: {}", e));
|
|
return ptr::null_mut();
|
|
}
|
|
};
|
|
|
|
let domain_name_ptr = domain_name_cstr
|
|
.as_ref()
|
|
.map_or(ptr::null(), |cstr| cstr.as_ptr());
|
|
let mut response_ptr: *const c_char = ptr::null();
|
|
let result = unsafe {
|
|
call_json_rpc(
|
|
service_name_cstr.as_ptr(),
|
|
method_name_cstr.as_ptr(),
|
|
domain_name_ptr,
|
|
payload_json_cstr.as_ptr(),
|
|
&mut response_ptr,
|
|
)
|
|
};
|
|
|
|
if result != 0 {
|
|
if let Some(error) = get_last_error() {
|
|
throw_exception(&mut env, &error);
|
|
}
|
|
return ptr::null_mut();
|
|
}
|
|
|
|
if response_ptr.is_null() {
|
|
throw_exception(&mut env, "JSON RPC returned a null response");
|
|
return ptr::null_mut();
|
|
}
|
|
|
|
let response = unsafe { CStr::from_ptr(response_ptr) }
|
|
.to_string_lossy()
|
|
.into_owned();
|
|
free_string(response_ptr);
|
|
|
|
match env.new_string(&response) {
|
|
Ok(jstr) => jstr.into_raw(),
|
|
Err(_) => {
|
|
throw_exception(&mut env, "Failed to create JSON RPC response string");
|
|
ptr::null_mut()
|
|
}
|
|
}
|
|
}
|