Skip to content
This repository has been archived by the owner on Jul 2, 2024. It is now read-only.

Commit

Permalink
Optimize native code
Browse files Browse the repository at this point in the history
  • Loading branch information
SanmerDev committed Feb 27, 2024
1 parent 57d54d4 commit b35ee38
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 54 deletions.
103 changes: 49 additions & 54 deletions native/jni/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,68 +4,63 @@ use jni::objects::{JClass, JObject, JValue};
use jni::sys::{jdouble, jint};
use jni::JNIEnv;

pub trait JNI<'local> {
fn set_double_field(&mut self, obj: &JObject, name: &str, val: jdouble) -> Result<()>;
fn throw_illegal_decimal(self, decimal: f64) -> JObject<'local>;
fn new_mf_object(self, m: &MagneticField) -> JObject<'local>;
macro_rules! set_double_field {
($self:expr, $obj:expr, $name:expr, $val:expr) => {
$self.set_field($obj, $name, "D", JValue::from($val))
};
}

impl<'a> JNI<'a> for JNIEnv<'a> {
#[inline]
fn set_double_field(&mut self, obj: &JObject, name: &str, val: jdouble) -> Result<()> {
self.set_field(obj, name, "D", JValue::from(val))
}

fn throw_illegal_decimal(mut self, decimal: f64) -> JObject<'a> {
self.throw_new(
"java/lang/IllegalArgumentException",
format!("decimal = {decimal}"),
)
.unwrap_or_else(|e| {
eprintln!("{e}");
});

JObject::null()
}

fn new_mf_object(mut self, m: &MagneticField) -> JObject<'a> {
match build_mf_object(&mut self, &m) {
Ok(obj) => obj,
Err(err) => {
self.throw_new("java/lang/IllegalArgumentException", err.to_string())
.unwrap_or_else(|e| {
eprintln!("{e}");
});
#[inline]
fn throw_illegal_decimal<'local>(env: &mut JNIEnv<'local>, decimal: f64) -> JObject<'local> {
env.throw_new(
"java/lang/IllegalArgumentException",
format!("decimal = {decimal}"),
)
.unwrap_or_else(|e| {
eprintln!("{e}");
});

JObject::null()
}
}
}
JObject::null()
}

#[inline]
fn build_mf_object<'local>(env: &mut JNIEnv<'local>, m: &MagneticField) -> Result<JObject<'local>> {
let class = env.find_class("dev/sanmer/geomag/MagneticField")?;
let obj = env.alloc_object(class)?;

env.set_double_field(&obj, "x", m.x)?;
env.set_double_field(&obj, "xDot", m.x_dot)?;
env.set_double_field(&obj, "y", m.y)?;
env.set_double_field(&obj, "yDot", m.y_dot)?;
env.set_double_field(&obj, "z", m.z)?;
env.set_double_field(&obj, "zDot", m.z_dot)?;
env.set_double_field(&obj, "h", m.h)?;
env.set_double_field(&obj, "hDot", m.h_dot)?;
env.set_double_field(&obj, "f", m.f)?;
env.set_double_field(&obj, "fDot", m.f_dot)?;
env.set_double_field(&obj, "d", m.d)?;
env.set_double_field(&obj, "dDot", m.d_dot)?;
env.set_double_field(&obj, "i", m.i)?;
env.set_double_field(&obj, "iDot", m.i_dot)?;
set_double_field!(env, &obj, "x", m.x)?;
set_double_field!(env, &obj, "xDot", m.x_dot)?;
set_double_field!(env, &obj, "y", m.y)?;
set_double_field!(env, &obj, "yDot", m.y_dot)?;
set_double_field!(env, &obj, "z", m.z)?;
set_double_field!(env, &obj, "zDot", m.z_dot)?;
set_double_field!(env, &obj, "h", m.h)?;
set_double_field!(env, &obj, "hDot", m.h_dot)?;
set_double_field!(env, &obj, "f", m.f)?;
set_double_field!(env, &obj, "fDot", m.f_dot)?;
set_double_field!(env, &obj, "d", m.d)?;
set_double_field!(env, &obj, "dDot", m.d_dot)?;
set_double_field!(env, &obj, "i", m.i)?;
set_double_field!(env, &obj, "iDot", m.i_dot)?;

Ok(obj)
}

#[inline]
fn new_mf_object<'local>(env: &mut JNIEnv<'local>, m: &MagneticField) -> JObject<'local> {
match build_mf_object(env, &m) {
Ok(obj) => obj,
Err(err) => {
env.throw_new("java/lang/IllegalArgumentException", err.to_string())
.unwrap_or_else(|e| {
eprintln!("{e}");
});

JObject::null()
}
}
}

#[no_mangle]
pub unsafe extern "system" fn Java_dev_sanmer_geomag_Geomag_toDecimalYears(
_env: JNIEnv,
Expand All @@ -92,7 +87,7 @@ pub unsafe extern "system" fn Java_dev_sanmer_geomag_Geomag_toDecimalYears(

#[no_mangle]
pub unsafe extern "system" fn Java_dev_sanmer_geomag_Geomag_wmm<'local>(
env: JNIEnv<'local>,
mut env: JNIEnv<'local>,
_class: JClass,
longitude: jdouble,
latitude: jdouble,
Expand All @@ -103,14 +98,14 @@ pub unsafe extern "system" fn Java_dev_sanmer_geomag_Geomag_wmm<'local>(
let wmm = WMM::new(decimal);

match wmm {
None => env.throw_illegal_decimal(decimal),
Some(m) => env.new_mf_object(&m.at_location(&l)),
None => throw_illegal_decimal(&mut env, decimal),
Some(m) => new_mf_object(&mut env, &m.at_location(&l)),
}
}

#[no_mangle]
pub unsafe extern "system" fn Java_dev_sanmer_geomag_Geomag_igrf<'local>(
env: JNIEnv<'local>,
mut env: JNIEnv<'local>,
_class: JClass,
longitude: jdouble,
latitude: jdouble,
Expand All @@ -121,7 +116,7 @@ pub unsafe extern "system" fn Java_dev_sanmer_geomag_Geomag_igrf<'local>(
let igrf = IGRF::new(decimal);

match igrf {
None => env.throw_illegal_decimal(decimal),
Some(m) => env.new_mf_object(&m.at_location(&l)),
None => throw_illegal_decimal(&mut env, decimal),
Some(m) => new_mf_object(&mut env, &m.at_location(&l)),
}
}
Binary file modified native/src/main/libs/arm64-v8a/libgeomag-jni.so
Binary file not shown.
Binary file modified native/src/main/libs/x86_64/libgeomag-jni.so
Binary file not shown.

0 comments on commit b35ee38

Please sign in to comment.