1472 lines
52 KiB
Rust
1472 lines
52 KiB
Rust
#[allow(dead_code)]
|
|
mod internal_aliases {
|
|
use super::*;
|
|
pub type JStringOptStr = jstring;
|
|
pub type JOptionalInt = jobject;
|
|
pub type JInteger = jobject;
|
|
pub type JByte = jobject;
|
|
pub type JShort = jobject;
|
|
pub type JFloat = jobject;
|
|
pub type JDouble = jobject;
|
|
pub type JOptionalDouble = jobject;
|
|
pub type JLong = jobject;
|
|
pub type JOptionalLong = jobject;
|
|
#[repr(transparent)]
|
|
pub struct JForeignObjectsArray<T: SwigForeignClass> {
|
|
pub(crate) inner: jobjectArray,
|
|
pub(crate) _marker: ::std::marker::PhantomData<T>,
|
|
}
|
|
pub type JStringPath = jstring;
|
|
pub type JStringObjectsArray = jobjectArray;
|
|
}
|
|
#[doc = " Default JNI_VERSION"]
|
|
const SWIG_JNI_VERSION: jint = JNI_VERSION_1_6 as jint;
|
|
#[doc = " Marker for what to cache in JNI_OnLoad"]
|
|
#[allow(unused_macros)]
|
|
macro_rules! swig_jni_find_class {
|
|
($ id : ident , $ path : expr) => {
|
|
unsafe { $id }
|
|
};
|
|
($ id : ident , $ path : expr ,) => {
|
|
unsafe { $id }
|
|
};
|
|
}
|
|
#[allow(unused_macros)]
|
|
macro_rules! swig_jni_get_method_id {
|
|
($ global_id : ident , $ class_id : ident , $ name : expr , $ sig : expr) => {
|
|
unsafe { $global_id }
|
|
};
|
|
($ global_id : ident , $ class_id : ident , $ name : expr , $ sig : expr ,) => {
|
|
unsafe { $global_id }
|
|
};
|
|
}
|
|
#[allow(unused_macros)]
|
|
macro_rules! swig_jni_get_static_method_id {
|
|
($ global_id : ident , $ class_id : ident , $ name : expr , $ sig : expr) => {
|
|
unsafe { $global_id }
|
|
};
|
|
($ global_id : ident , $ class_id : ident , $ name : expr , $ sig : expr ,) => {
|
|
unsafe { $global_id }
|
|
};
|
|
}
|
|
#[allow(unused_macros)]
|
|
macro_rules! swig_jni_get_field_id {
|
|
($ global_id : ident , $ class_id : ident , $ name : expr , $ sig : expr) => {
|
|
unsafe { $global_id }
|
|
};
|
|
($ global_id : ident , $ class_id : ident , $ name : expr , $ sig : expr ,) => {
|
|
unsafe { $global_id }
|
|
};
|
|
}
|
|
#[allow(unused_macros)]
|
|
macro_rules! swig_jni_get_static_field_id {
|
|
($ global_id : ident , $ class_id : ident , $ name : expr , $ sig : expr) => {
|
|
unsafe { $global_id }
|
|
};
|
|
($ global_id : ident , $ class_id : ident , $ name : expr , $ sig : expr ,) => {
|
|
unsafe { $global_id }
|
|
};
|
|
}
|
|
#[allow(dead_code)]
|
|
#[doc = ""]
|
|
trait SwigInto<T> {
|
|
fn swig_into(self, env: *mut JNIEnv) -> T;
|
|
}
|
|
#[allow(dead_code)]
|
|
#[doc = ""]
|
|
trait SwigFrom<T> {
|
|
fn swig_from(_: T, env: *mut JNIEnv) -> Self;
|
|
}
|
|
#[allow(unused_macros)]
|
|
macro_rules! swig_c_str {
|
|
($ lit : expr) => {
|
|
concat!($lit, "\0").as_ptr() as *const ::std::os::raw::c_char
|
|
};
|
|
}
|
|
#[allow(unused_macros)]
|
|
macro_rules ! swig_assert_eq_size { ($ x : ty , $ ($ xs : ty) ,+ $ (,) *) => { $ (let _ = :: std :: mem :: transmute ::<$ x , $ xs >;) + } ; }
|
|
#[cfg(target_pointer_width = "32")]
|
|
pub unsafe fn jlong_to_pointer<T>(val: jlong) -> *mut T {
|
|
(val as u32) as *mut T
|
|
}
|
|
#[cfg(target_pointer_width = "64")]
|
|
pub unsafe fn jlong_to_pointer<T>(val: jlong) -> *mut T {
|
|
val as *mut T
|
|
}
|
|
#[allow(dead_code)]
|
|
pub trait SwigForeignClass {
|
|
type PointedType;
|
|
fn jni_class() -> jclass;
|
|
fn jni_class_pointer_field() -> jfieldID;
|
|
fn box_object(x: Self) -> jlong;
|
|
fn unbox_object(x: jlong) -> Self;
|
|
fn to_pointer(x: jlong) -> ::std::ptr::NonNull<Self::PointedType>;
|
|
}
|
|
#[allow(dead_code)]
|
|
pub trait SwigForeignCLikeEnum {
|
|
fn as_jint(&self) -> jint;
|
|
#[doc = " # Panics"]
|
|
#[doc = " Panics on error"]
|
|
fn from_jint(_: jint) -> Self;
|
|
}
|
|
#[allow(dead_code)]
|
|
struct JavaCallback {
|
|
java_vm: *mut JavaVM,
|
|
this: jobject,
|
|
methods: Vec<jmethodID>,
|
|
}
|
|
#[doc = " According to JNI spec it should be safe to"]
|
|
#[doc = " pass pointer to JavaVm and jobject (global) across threads"]
|
|
unsafe impl Send for JavaCallback {}
|
|
#[allow(dead_code)]
|
|
struct JniEnvHolder<'a> {
|
|
env: Option<*mut JNIEnv>,
|
|
callback: &'a JavaCallback,
|
|
need_detach: bool,
|
|
}
|
|
#[allow(dead_code)]
|
|
impl<'a> Drop for JniEnvHolder<'a> {
|
|
fn drop(&mut self) {
|
|
if self.need_detach {
|
|
let res = unsafe {
|
|
(**self.callback.java_vm).DetachCurrentThread.unwrap()(self.callback.java_vm)
|
|
};
|
|
if res != 0 {
|
|
log::error!("JniEnvHolder: DetachCurrentThread failed: {}", res);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#[allow(dead_code)]
|
|
impl JavaCallback {
|
|
fn new(obj: jobject, env: *mut JNIEnv) -> JavaCallback {
|
|
let mut java_vm: *mut JavaVM = ::std::ptr::null_mut();
|
|
let ret = unsafe { (**env).GetJavaVM.unwrap()(env, &mut java_vm) };
|
|
assert_eq!(0, ret, "GetJavaVm failed");
|
|
let global_obj = unsafe { (**env).NewGlobalRef.unwrap()(env, obj) };
|
|
assert!(!global_obj.is_null());
|
|
JavaCallback {
|
|
java_vm,
|
|
this: global_obj,
|
|
methods: Vec::new(),
|
|
}
|
|
}
|
|
fn get_jni_env(&self) -> JniEnvHolder {
|
|
assert!(!self.java_vm.is_null());
|
|
let mut env: *mut JNIEnv = ::std::ptr::null_mut();
|
|
let res = unsafe {
|
|
(**self.java_vm).GetEnv.unwrap()(
|
|
self.java_vm,
|
|
(&mut env) as *mut *mut JNIEnv as *mut *mut ::std::os::raw::c_void,
|
|
SWIG_JNI_VERSION,
|
|
)
|
|
};
|
|
if res == (JNI_OK as jint) {
|
|
return JniEnvHolder {
|
|
env: Some(env),
|
|
callback: self,
|
|
need_detach: false,
|
|
};
|
|
}
|
|
if res != (JNI_EDETACHED as jint) {
|
|
panic!("get_jni_env: GetEnv return error `{}`", res);
|
|
}
|
|
trait ConvertPtr<T> {
|
|
fn convert_ptr(self) -> T;
|
|
}
|
|
impl ConvertPtr<*mut *mut ::std::os::raw::c_void> for *mut *mut JNIEnv {
|
|
fn convert_ptr(self) -> *mut *mut ::std::os::raw::c_void {
|
|
self as *mut *mut ::std::os::raw::c_void
|
|
}
|
|
}
|
|
impl ConvertPtr<*mut *mut JNIEnv> for *mut *mut JNIEnv {
|
|
fn convert_ptr(self) -> *mut *mut JNIEnv {
|
|
self
|
|
}
|
|
}
|
|
let res = unsafe {
|
|
(**self.java_vm).AttachCurrentThread.unwrap()(
|
|
self.java_vm,
|
|
(&mut env as *mut *mut JNIEnv).convert_ptr(),
|
|
::std::ptr::null_mut(),
|
|
)
|
|
};
|
|
if res != 0 {
|
|
log::error!(
|
|
"JavaCallback::get_jnienv: AttachCurrentThread failed: {}",
|
|
res
|
|
);
|
|
JniEnvHolder {
|
|
env: None,
|
|
callback: self,
|
|
need_detach: false,
|
|
}
|
|
} else {
|
|
assert!(!env.is_null());
|
|
JniEnvHolder {
|
|
env: Some(env),
|
|
callback: self,
|
|
need_detach: true,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#[allow(dead_code)]
|
|
impl Drop for JavaCallback {
|
|
fn drop(&mut self) {
|
|
let env = self.get_jni_env();
|
|
if let Some(env) = env.env {
|
|
assert!(!env.is_null());
|
|
unsafe { (**env).DeleteGlobalRef.unwrap()(env, self.this) };
|
|
} else {
|
|
log::error!("JavaCallback::drop failed, can not get JNIEnv");
|
|
}
|
|
}
|
|
}
|
|
#[allow(dead_code)]
|
|
fn jni_throw(env: *mut JNIEnv, ex_class: jclass, message: &str) {
|
|
let c_message = ::std::ffi::CString::new(message).unwrap();
|
|
let res = unsafe { (**env).ThrowNew.unwrap()(env, ex_class, c_message.as_ptr()) };
|
|
if res != 0 {
|
|
log::error!(
|
|
"JNI ThrowNew({}) failed for class {:?} failed",
|
|
message,
|
|
ex_class
|
|
);
|
|
}
|
|
}
|
|
#[allow(dead_code)]
|
|
fn jni_throw_exception(env: *mut JNIEnv, message: &str) {
|
|
let exception_class = swig_jni_find_class!(JAVA_LANG_EXCEPTION, "java/lang/Exception");
|
|
jni_throw(env, exception_class, message)
|
|
}
|
|
#[allow(dead_code)]
|
|
fn object_to_jobject<T: SwigForeignClass>(env: *mut JNIEnv, obj: T) -> jobject {
|
|
let jcls = <T>::jni_class();
|
|
assert!(!jcls.is_null());
|
|
let field_id = <T>::jni_class_pointer_field();
|
|
assert!(!field_id.is_null());
|
|
let jobj: jobject = unsafe { (**env).AllocObject.unwrap()(env, jcls) };
|
|
assert!(!jobj.is_null(), "object_to_jobject: AllocObject failed");
|
|
let ret: jlong = <T>::box_object(obj);
|
|
unsafe {
|
|
(**env).SetLongField.unwrap()(env, jobj, field_id, ret);
|
|
if (**env).ExceptionCheck.unwrap()(env) != 0 {
|
|
panic!("object_to_jobject: Can not set mNativeObj field: catch exception");
|
|
}
|
|
}
|
|
jobj
|
|
}
|
|
#[allow(dead_code)]
|
|
fn jobject_array_to_vec_of_objects<T: SwigForeignClass + Clone>(
|
|
env: *mut JNIEnv,
|
|
arr: internal_aliases::JForeignObjectsArray<T>,
|
|
) -> Vec<T> {
|
|
let field_id = <T>::jni_class_pointer_field();
|
|
assert!(!field_id.is_null());
|
|
let length = unsafe { (**env).GetArrayLength.unwrap()(env, arr.inner) };
|
|
let len = <usize as ::std::convert::TryFrom<jsize>>::try_from(length)
|
|
.expect("invalid jsize, in jsize => usize conversion");
|
|
let mut result = Vec::with_capacity(len);
|
|
for i in 0..length {
|
|
let native: &mut T = unsafe {
|
|
let obj = (**env).GetObjectArrayElement.unwrap()(env, arr.inner, i);
|
|
if (**env).ExceptionCheck.unwrap()(env) != 0 {
|
|
panic!("Failed to retrieve element {} from this `jobjectArray'", i);
|
|
}
|
|
let ptr = (**env).GetLongField.unwrap()(env, obj, field_id);
|
|
let native = (jlong_to_pointer(ptr) as *mut T).as_mut().unwrap();
|
|
(**env).DeleteLocalRef.unwrap()(env, obj);
|
|
native
|
|
};
|
|
result.push(native.clone());
|
|
}
|
|
result
|
|
}
|
|
#[allow(dead_code)]
|
|
fn vec_of_objects_to_jobject_array<T: SwigForeignClass>(
|
|
env: *mut JNIEnv,
|
|
mut arr: Vec<T>,
|
|
) -> internal_aliases::JForeignObjectsArray<T> {
|
|
let jcls: jclass = <T>::jni_class();
|
|
assert!(!jcls.is_null());
|
|
let arr_len = <jsize as ::std::convert::TryFrom<usize>>::try_from(arr.len())
|
|
.expect("invalid usize, in usize => to jsize conversion");
|
|
let obj_arr: jobjectArray =
|
|
unsafe { (**env).NewObjectArray.unwrap()(env, arr_len, jcls, ::std::ptr::null_mut()) };
|
|
assert!(!obj_arr.is_null());
|
|
let field_id = <T>::jni_class_pointer_field();
|
|
assert!(!field_id.is_null());
|
|
for (i, r_obj) in arr.drain(..).enumerate() {
|
|
let jobj: jobject = unsafe { (**env).AllocObject.unwrap()(env, jcls) };
|
|
assert!(!jobj.is_null());
|
|
let r_obj: jlong = <T>::box_object(r_obj);
|
|
unsafe {
|
|
(**env).SetLongField.unwrap()(env, jobj, field_id, r_obj);
|
|
if (**env).ExceptionCheck.unwrap()(env) != 0 {
|
|
panic!("Can not mNativeObj field: catch exception");
|
|
}
|
|
(**env).SetObjectArrayElement.unwrap()(env, obj_arr, i as jsize, jobj);
|
|
if (**env).ExceptionCheck.unwrap()(env) != 0 {
|
|
panic!("SetObjectArrayElement({}) failed", i);
|
|
}
|
|
(**env).DeleteLocalRef.unwrap()(env, jobj);
|
|
}
|
|
}
|
|
internal_aliases::JForeignObjectsArray {
|
|
inner: obj_arr,
|
|
_marker: ::std::marker::PhantomData,
|
|
}
|
|
}
|
|
#[allow(dead_code)]
|
|
trait JniInvalidValue {
|
|
fn jni_invalid_value() -> Self;
|
|
}
|
|
impl<T> JniInvalidValue for *const T {
|
|
fn jni_invalid_value() -> Self {
|
|
::std::ptr::null()
|
|
}
|
|
}
|
|
impl<T> JniInvalidValue for *mut T {
|
|
fn jni_invalid_value() -> Self {
|
|
::std::ptr::null_mut()
|
|
}
|
|
}
|
|
impl JniInvalidValue for () {
|
|
fn jni_invalid_value() {}
|
|
}
|
|
impl<T: SwigForeignClass> JniInvalidValue for internal_aliases::JForeignObjectsArray<T> {
|
|
fn jni_invalid_value() -> Self {
|
|
Self {
|
|
inner: ::std::ptr::null_mut(),
|
|
_marker: ::std::marker::PhantomData,
|
|
}
|
|
}
|
|
}
|
|
macro_rules ! impl_jni_jni_invalid_value { ($ ($ type : ty) *) => ($ (impl JniInvalidValue for $ type { fn jni_invalid_value () -> Self { <$ type >:: default () } }) *) }
|
|
impl_jni_jni_invalid_value! { jbyte jshort jint jlong jfloat jdouble jboolean }
|
|
#[allow(dead_code)]
|
|
pub fn u64_to_jlong_checked(x: u64) -> jlong {
|
|
<jlong as ::std::convert::TryFrom<u64>>::try_from(x)
|
|
.expect("invalid u64, in u64 => jlong conversion")
|
|
}
|
|
#[allow(dead_code)]
|
|
struct JavaUTF16Slice {
|
|
string: jstring,
|
|
chars: *const ::std::os::raw::c_ushort,
|
|
len: usize,
|
|
env: *mut JNIEnv,
|
|
}
|
|
#[allow(dead_code)]
|
|
impl JavaUTF16Slice {
|
|
pub fn new(env: *mut JNIEnv, js: jstring) -> JavaUTF16Slice {
|
|
let len = unsafe { (**env).GetStringLength.unwrap()(env, js) };
|
|
let chars = unsafe { (**env).GetStringChars.unwrap()(env, js, ::std::ptr::null_mut()) };
|
|
JavaUTF16Slice {
|
|
string: js,
|
|
chars,
|
|
len: len as usize,
|
|
env,
|
|
}
|
|
}
|
|
pub fn as_slice(&self) -> &[u16] {
|
|
unsafe { ::std::slice::from_raw_parts(self.chars, self.len) }
|
|
}
|
|
pub fn into_string(self) -> String {
|
|
String::from_utf16(self.as_slice()).unwrap()
|
|
}
|
|
}
|
|
#[allow(dead_code)]
|
|
impl Drop for JavaUTF16Slice {
|
|
fn drop(&mut self) {
|
|
unsafe {
|
|
(**self.env).ReleaseStringChars.unwrap()(self.env, self.string, self.chars);
|
|
}
|
|
}
|
|
}
|
|
#[allow(dead_code)]
|
|
fn from_jstring_std_string(js: jstring, env: *mut JNIEnv) -> String {
|
|
if !js.is_null() {
|
|
JavaUTF16Slice::new(env, js).into_string()
|
|
} else {
|
|
"".to_string()
|
|
}
|
|
}
|
|
#[allow(dead_code)]
|
|
fn from_std_str_jstring(x: &str, env: *mut JNIEnv) -> jstring {
|
|
let x: Vec<::std::os::raw::c_ushort> = x.encode_utf16().collect();
|
|
unsafe { (**env).NewString.unwrap()(env, x.as_ptr(), x.len() as i32) }
|
|
}
|
|
#[allow(dead_code)]
|
|
fn vec_string_to_jobject_array(mut arr: Vec<String>, env: *mut JNIEnv) -> jobjectArray {
|
|
let jcls: jclass = swig_jni_find_class!(JAVA_LANG_STRING, "java/lang/String");
|
|
assert!(!jcls.is_null());
|
|
let obj_arr: jobjectArray = unsafe {
|
|
(**env).NewObjectArray.unwrap()(env, arr.len() as jsize, jcls, ::std::ptr::null_mut())
|
|
};
|
|
assert!(!obj_arr.is_null());
|
|
for (i, r_str) in arr.drain(..).enumerate() {
|
|
let jstr: jstring = from_std_str_jstring(&r_str, env);
|
|
assert!(!jstr.is_null());
|
|
unsafe {
|
|
(**env).SetObjectArrayElement.unwrap()(env, obj_arr, i as jsize, jstr);
|
|
if (**env).ExceptionCheck.unwrap()(env) != 0 {
|
|
panic!("SetObjectArrayElement({}) failed", i);
|
|
}
|
|
(**env).DeleteLocalRef.unwrap()(env, jstr);
|
|
}
|
|
}
|
|
obj_arr
|
|
}
|
|
macro_rules ! define_array_handling_code { ($ ([jni_arr_type = $ jni_arr_type : ident , rust_arr_wrapper = $ rust_arr_wrapper : ident , jni_get_array_elements = $ jni_get_array_elements : ident , jni_elem_type = $ jni_elem_type : ident , rust_elem_type = $ rust_elem_type : ident , jni_release_array_elements = $ jni_release_array_elements : ident , jni_new_array = $ jni_new_array : ident , jni_set_array_region = $ jni_set_array_region : ident]) ,*) => { $ (# [allow (dead_code)] struct $ rust_arr_wrapper { array : $ jni_arr_type , data : * mut $ jni_elem_type , env : * mut JNIEnv , } # [allow (dead_code)] impl $ rust_arr_wrapper { fn new (env : * mut JNIEnv , array : $ jni_arr_type) -> $ rust_arr_wrapper { assert ! (! array . is_null ()) ; let data = unsafe { (** env) .$ jni_get_array_elements . unwrap () (env , array , :: std :: ptr :: null_mut ()) } ; $ rust_arr_wrapper { array , data , env } } fn to_slice (& self) -> & [$ rust_elem_type] { unsafe { let len : jsize = (** self . env) . GetArrayLength . unwrap () (self . env , self . array) ; assert ! ((len as u64) <= (usize :: max_value () as u64)) ; :: std :: slice :: from_raw_parts (self . data , len as usize) } } fn from_slice_to_raw (arr : & [$ rust_elem_type] , env : * mut JNIEnv) -> $ jni_arr_type { assert ! ((arr . len () as u64) <= (jsize :: max_value () as u64)) ; let jarr : $ jni_arr_type = unsafe { (** env) .$ jni_new_array . unwrap () (env , arr . len () as jsize) } ; assert ! (! jarr . is_null ()) ; unsafe { (** env) .$ jni_set_array_region . unwrap () (env , jarr , 0 , arr . len () as jsize , arr . as_ptr ()) ; if (** env) . ExceptionCheck . unwrap () (env) != 0 { panic ! ("{}:{} {} failed" , file ! () , line ! () , stringify ! ($ jni_set_array_region)) ; } } jarr } } # [allow (dead_code)] impl Drop for $ rust_arr_wrapper { fn drop (& mut self) { assert ! (! self . env . is_null ()) ; assert ! (! self . array . is_null ()) ; unsafe { (** self . env) .$ jni_release_array_elements . unwrap () (self . env , self . array , self . data , JNI_ABORT as jint ,) } ; } }) * } }
|
|
define_array_handling_code!(
|
|
[
|
|
jni_arr_type = jbyteArray,
|
|
rust_arr_wrapper = JavaByteArray,
|
|
jni_get_array_elements = GetByteArrayElements,
|
|
jni_elem_type = jbyte,
|
|
rust_elem_type = i8,
|
|
jni_release_array_elements = ReleaseByteArrayElements,
|
|
jni_new_array = NewByteArray,
|
|
jni_set_array_region = SetByteArrayRegion
|
|
],
|
|
[
|
|
jni_arr_type = jshortArray,
|
|
rust_arr_wrapper = JavaShortArray,
|
|
jni_get_array_elements = GetShortArrayElements,
|
|
jni_elem_type = jshort,
|
|
rust_elem_type = i16,
|
|
jni_release_array_elements = ReleaseShortArrayElements,
|
|
jni_new_array = NewShortArray,
|
|
jni_set_array_region = SetShortArrayRegion
|
|
],
|
|
[
|
|
jni_arr_type = jintArray,
|
|
rust_arr_wrapper = JavaIntArray,
|
|
jni_get_array_elements = GetIntArrayElements,
|
|
jni_elem_type = jint,
|
|
rust_elem_type = i32,
|
|
jni_release_array_elements = ReleaseIntArrayElements,
|
|
jni_new_array = NewIntArray,
|
|
jni_set_array_region = SetIntArrayRegion
|
|
],
|
|
[
|
|
jni_arr_type = jlongArray,
|
|
rust_arr_wrapper = JavaLongArray,
|
|
jni_get_array_elements = GetLongArrayElements,
|
|
jni_elem_type = jlong,
|
|
rust_elem_type = i64,
|
|
jni_release_array_elements = ReleaseLongArrayElements,
|
|
jni_new_array = NewLongArray,
|
|
jni_set_array_region = SetLongArrayRegion
|
|
],
|
|
[
|
|
jni_arr_type = jfloatArray,
|
|
rust_arr_wrapper = JavaFloatArray,
|
|
jni_get_array_elements = GetFloatArrayElements,
|
|
jni_elem_type = jfloat,
|
|
rust_elem_type = f32,
|
|
jni_release_array_elements = ReleaseFloatArrayElements,
|
|
jni_new_array = NewFloatArray,
|
|
jni_set_array_region = SetFloatArrayRegion
|
|
],
|
|
[
|
|
jni_arr_type = jdoubleArray,
|
|
rust_arr_wrapper = JavaDoubleArray,
|
|
jni_get_array_elements = GetDoubleArrayElements,
|
|
jni_elem_type = jdouble,
|
|
rust_elem_type = f64,
|
|
jni_release_array_elements = ReleaseDoubleArrayElements,
|
|
jni_new_array = NewDoubleArray,
|
|
jni_set_array_region = SetDoubleArrayRegion
|
|
]
|
|
);
|
|
#[allow(dead_code)]
|
|
fn to_java_util_optional_double(
|
|
env: *mut JNIEnv,
|
|
x: Option<f64>,
|
|
) -> internal_aliases::JOptionalDouble {
|
|
let class: jclass = swig_jni_find_class!(JAVA_UTIL_OPTIONAL_DOUBLE, "java/util/OptionalDouble");
|
|
assert!(!class.is_null(),);
|
|
match x {
|
|
Some(val) => {
|
|
let of_m: jmethodID = swig_jni_get_static_method_id!(
|
|
JAVA_UTIL_OPTIONAL_DOUBLE_OF,
|
|
JAVA_UTIL_OPTIONAL_DOUBLE,
|
|
"of",
|
|
"(D)Ljava/util/OptionalDouble;"
|
|
);
|
|
assert!(!of_m.is_null());
|
|
let ret = unsafe {
|
|
let ret = (**env).CallStaticObjectMethod.unwrap()(env, class, of_m, val);
|
|
if (**env).ExceptionCheck.unwrap()(env) != 0 {
|
|
panic!("OptionalDouble.of failed: catch exception");
|
|
}
|
|
ret
|
|
};
|
|
assert!(!ret.is_null());
|
|
ret
|
|
}
|
|
None => {
|
|
let empty_m: jmethodID = swig_jni_get_static_method_id!(
|
|
JAVA_UTIL_OPTIONAL_DOUBLE_EMPTY,
|
|
JAVA_UTIL_OPTIONAL_DOUBLE,
|
|
"empty",
|
|
"()Ljava/util/OptionalDouble;"
|
|
);
|
|
assert!(!empty_m.is_null());
|
|
let ret = unsafe {
|
|
let ret = (**env).CallStaticObjectMethod.unwrap()(env, class, empty_m);
|
|
if (**env).ExceptionCheck.unwrap()(env) != 0 {
|
|
panic!("OptionalDouble.empty failed: catch exception");
|
|
}
|
|
ret
|
|
};
|
|
assert!(!ret.is_null());
|
|
ret
|
|
}
|
|
}
|
|
}
|
|
#[allow(dead_code)]
|
|
fn from_java_lang_double_to_rust(env: *mut JNIEnv, x: internal_aliases::JDouble) -> Option<f64> {
|
|
if x.is_null() {
|
|
None
|
|
} else {
|
|
let x = unsafe { (**env).NewLocalRef.unwrap()(env, x) };
|
|
if x.is_null() {
|
|
None
|
|
} else {
|
|
let class: jclass = swig_jni_find_class!(JAVA_LANG_DOUBLE, "java/lang/Double");
|
|
assert!(!class.is_null());
|
|
let double_value_m: jmethodID = swig_jni_get_method_id!(
|
|
JAVA_LANG_DOUBLE_DOUBLE_VALUE_METHOD,
|
|
JAVA_LANG_DOUBLE,
|
|
"doubleValue",
|
|
"()D",
|
|
);
|
|
assert!(!double_value_m.is_null(),);
|
|
let ret: f64 = unsafe {
|
|
let ret = (**env).CallDoubleMethod.unwrap()(env, x, double_value_m);
|
|
if (**env).ExceptionCheck.unwrap()(env) != 0 {
|
|
panic!("Double.doubleValue failed: catch exception");
|
|
}
|
|
(**env).DeleteLocalRef.unwrap()(env, x);
|
|
ret
|
|
};
|
|
Some(ret)
|
|
}
|
|
}
|
|
}
|
|
#[allow(dead_code)]
|
|
fn from_java_lang_float_to_rust(env: *mut JNIEnv, x: internal_aliases::JFloat) -> Option<f32> {
|
|
if x.is_null() {
|
|
None
|
|
} else {
|
|
let x = unsafe { (**env).NewLocalRef.unwrap()(env, x) };
|
|
if x.is_null() {
|
|
None
|
|
} else {
|
|
let class: jclass = swig_jni_find_class!(JAVA_LANG_FLOAT, "java/lang/Float");
|
|
assert!(!class.is_null());
|
|
let float_value_m: jmethodID = swig_jni_get_method_id!(
|
|
JAVA_LANG_FLOAT_FLOAT_VALUE,
|
|
JAVA_LANG_FLOAT,
|
|
"floatValue",
|
|
"()F"
|
|
);
|
|
assert!(!float_value_m.is_null());
|
|
let ret: f32 = unsafe {
|
|
let ret = (**env).CallFloatMethod.unwrap()(env, x, float_value_m);
|
|
if (**env).ExceptionCheck.unwrap()(env) != 0 {
|
|
panic!("Float.floatValue failed: catch exception");
|
|
}
|
|
(**env).DeleteLocalRef.unwrap()(env, x);
|
|
ret
|
|
};
|
|
Some(ret)
|
|
}
|
|
}
|
|
}
|
|
#[allow(dead_code)]
|
|
fn to_java_util_optional_long(env: *mut JNIEnv, x: Option<i64>) -> internal_aliases::JOptionalLong {
|
|
let class: jclass = swig_jni_find_class!(JAVA_UTIL_OPTIONAL_LONG, "java/util/OptionalLong");
|
|
assert!(!class.is_null(),);
|
|
match x {
|
|
Some(val) => {
|
|
let of_m: jmethodID = swig_jni_get_static_method_id!(
|
|
JAVA_UTIL_OPTIONAL_LONG_OF,
|
|
JAVA_UTIL_OPTIONAL_LONG,
|
|
"of",
|
|
"(J)Ljava/util/OptionalLong;"
|
|
);
|
|
assert!(!of_m.is_null());
|
|
let ret = unsafe {
|
|
let ret = (**env).CallStaticObjectMethod.unwrap()(env, class, of_m, val);
|
|
if (**env).ExceptionCheck.unwrap()(env) != 0 {
|
|
panic!("OptionalLong.of failed: catch exception");
|
|
}
|
|
ret
|
|
};
|
|
assert!(!ret.is_null());
|
|
ret
|
|
}
|
|
None => {
|
|
let empty_m: jmethodID = swig_jni_get_static_method_id!(
|
|
JAVA_UTIL_OPTIONAL_LONG_EMPTY,
|
|
JAVA_UTIL_OPTIONAL_LONG,
|
|
"empty",
|
|
"()Ljava/util/OptionalLong;",
|
|
);
|
|
assert!(!empty_m.is_null());
|
|
let ret = unsafe {
|
|
let ret = (**env).CallStaticObjectMethod.unwrap()(env, class, empty_m);
|
|
if (**env).ExceptionCheck.unwrap()(env) != 0 {
|
|
panic!("OptionalLong.empty failed: catch exception");
|
|
}
|
|
ret
|
|
};
|
|
assert!(!ret.is_null());
|
|
ret
|
|
}
|
|
}
|
|
}
|
|
#[allow(dead_code)]
|
|
fn from_java_lang_long_to_rust(env: *mut JNIEnv, x: internal_aliases::JLong) -> Option<i64> {
|
|
if x.is_null() {
|
|
None
|
|
} else {
|
|
let x = unsafe { (**env).NewLocalRef.unwrap()(env, x) };
|
|
if x.is_null() {
|
|
None
|
|
} else {
|
|
let class: jclass = swig_jni_find_class!(JAVA_LANG_LONG, "java/lang/Long");
|
|
assert!(!class.is_null());
|
|
let long_value_m: jmethodID = swig_jni_get_method_id!(
|
|
JAVA_LANG_LONG_LONG_VALUE,
|
|
JAVA_LANG_LONG,
|
|
"longValue",
|
|
"()J"
|
|
);
|
|
assert!(!long_value_m.is_null());
|
|
let ret: i64 = unsafe {
|
|
let ret = (**env).CallLongMethod.unwrap()(env, x, long_value_m);
|
|
if (**env).ExceptionCheck.unwrap()(env) != 0 {
|
|
panic!("Long.longValue failed: catch exception");
|
|
}
|
|
(**env).DeleteLocalRef.unwrap()(env, x);
|
|
ret
|
|
};
|
|
Some(ret)
|
|
}
|
|
}
|
|
}
|
|
#[allow(dead_code)]
|
|
fn from_java_lang_int_to_rust(env: *mut JNIEnv, x: internal_aliases::JInteger) -> Option<i32> {
|
|
if x.is_null() {
|
|
None
|
|
} else {
|
|
let x = unsafe { (**env).NewLocalRef.unwrap()(env, x) };
|
|
if x.is_null() {
|
|
None
|
|
} else {
|
|
let class: jclass = swig_jni_find_class!(JAVA_LANG_INTEGER, "java/lang/Integer");
|
|
assert!(!class.is_null());
|
|
let int_value_m: jmethodID = swig_jni_get_method_id!(
|
|
JAVA_LANG_INTEGER_INT_VALUE,
|
|
JAVA_LANG_INTEGER,
|
|
"intValue",
|
|
"()I"
|
|
);
|
|
assert!(!int_value_m.is_null(),);
|
|
let ret: i32 = unsafe {
|
|
let ret = (**env).CallIntMethod.unwrap()(env, x, int_value_m);
|
|
if (**env).ExceptionCheck.unwrap()(env) != 0 {
|
|
panic!("Integer.intValue failed: catch exception");
|
|
}
|
|
(**env).DeleteLocalRef.unwrap()(env, x);
|
|
ret
|
|
};
|
|
Some(ret)
|
|
}
|
|
}
|
|
}
|
|
#[allow(dead_code)]
|
|
fn from_java_lang_byte_to_rust(env: *mut JNIEnv, x: internal_aliases::JByte) -> Option<i8> {
|
|
if x.is_null() {
|
|
None
|
|
} else {
|
|
let x = unsafe { (**env).NewLocalRef.unwrap()(env, x) };
|
|
if x.is_null() {
|
|
None
|
|
} else {
|
|
let class: jclass = swig_jni_find_class!(JAVA_LANG_BYTE, "java/lang/Byte");
|
|
assert!(!class.is_null());
|
|
let byte_value_m: jmethodID = swig_jni_get_method_id!(
|
|
JAVA_LANG_BYTE_BYTE_VALUE,
|
|
JAVA_LANG_BYTE,
|
|
"byteValue",
|
|
"()B"
|
|
);
|
|
assert!(!byte_value_m.is_null(),);
|
|
let ret: i8 = unsafe {
|
|
let ret = (**env).CallByteMethod.unwrap()(env, x, byte_value_m);
|
|
if (**env).ExceptionCheck.unwrap()(env) != 0 {
|
|
panic!("Byte.byteValue failed: catch exception");
|
|
}
|
|
(**env).DeleteLocalRef.unwrap()(env, x);
|
|
ret
|
|
};
|
|
Some(ret)
|
|
}
|
|
}
|
|
}
|
|
#[allow(dead_code)]
|
|
fn from_java_lang_short_to_rust(env: *mut JNIEnv, x: internal_aliases::JByte) -> Option<i16> {
|
|
if x.is_null() {
|
|
None
|
|
} else {
|
|
let x = unsafe { (**env).NewLocalRef.unwrap()(env, x) };
|
|
if x.is_null() {
|
|
None
|
|
} else {
|
|
let class: jclass = swig_jni_find_class!(JAVA_LANG_SHORT, "java/lang/Short");
|
|
assert!(!class.is_null());
|
|
let short_value_m: jmethodID = swig_jni_get_method_id!(
|
|
JAVA_LANG_SHORT_SHORT_VALUE,
|
|
JAVA_LANG_SHORT,
|
|
"shortValue",
|
|
"()S"
|
|
);
|
|
assert!(!short_value_m.is_null());
|
|
let ret: i16 = unsafe {
|
|
let ret = (**env).CallShortMethod.unwrap()(env, x, short_value_m);
|
|
if (**env).ExceptionCheck.unwrap()(env) != 0 {
|
|
panic!("Short.shortValue failed: catch exception");
|
|
}
|
|
(**env).DeleteLocalRef.unwrap()(env, x);
|
|
ret
|
|
};
|
|
Some(ret)
|
|
}
|
|
}
|
|
}
|
|
#[allow(dead_code)]
|
|
fn to_java_util_optional_int(env: *mut JNIEnv, x: Option<i32>) -> jobject {
|
|
let class: jclass = swig_jni_find_class!(JAVA_UTIL_OPTIONAL_INT, "java/util/OptionalInt");
|
|
assert!(!class.is_null(),);
|
|
match x {
|
|
Some(val) => {
|
|
let of_m: jmethodID = swig_jni_get_static_method_id!(
|
|
JAVA_UTIL_OPTIONAL_INT_OF,
|
|
JAVA_UTIL_OPTIONAL_INT,
|
|
"of",
|
|
"(I)Ljava/util/OptionalInt;"
|
|
);
|
|
assert!(!of_m.is_null());
|
|
let ret = unsafe {
|
|
let ret = (**env).CallStaticObjectMethod.unwrap()(env, class, of_m, val);
|
|
if (**env).ExceptionCheck.unwrap()(env) != 0 {
|
|
panic!("OptionalInt.of failed: catch exception");
|
|
}
|
|
ret
|
|
};
|
|
assert!(!ret.is_null());
|
|
ret
|
|
}
|
|
None => {
|
|
let empty_m: jmethodID = swig_jni_get_static_method_id!(
|
|
JAVA_UTIL_OPTIONAL_INT_EMPTY,
|
|
JAVA_UTIL_OPTIONAL_INT,
|
|
"empty",
|
|
"()Ljava/util/OptionalInt;"
|
|
);
|
|
assert!(!empty_m.is_null());
|
|
let ret = unsafe {
|
|
let ret = (**env).CallStaticObjectMethod.unwrap()(env, class, empty_m);
|
|
if (**env).ExceptionCheck.unwrap()(env) != 0 {
|
|
panic!("OptionalInt.empty failed: catch exception");
|
|
}
|
|
ret
|
|
};
|
|
assert!(!ret.is_null());
|
|
ret
|
|
}
|
|
}
|
|
}
|
|
use crate::*;
|
|
use jni_sys::*;
|
|
#[allow(unused_variables, unused_mut, non_snake_case, unused_unsafe)]
|
|
#[no_mangle]
|
|
pub extern "C" fn Java_net_mbess_popequer_JNIReachabilityFence_reachabilityFence1(
|
|
_env: *mut JNIEnv,
|
|
_: jclass,
|
|
_: jobject,
|
|
) {
|
|
}
|
|
#[allow(unused_variables, unused_mut, non_snake_case, unused_unsafe)]
|
|
#[no_mangle]
|
|
pub extern "C" fn Java_net_mbess_popequer_JNIReachabilityFence_reachabilityFence2(
|
|
_env: *mut JNIEnv,
|
|
_: jclass,
|
|
_: jobject,
|
|
_: jobject,
|
|
) {
|
|
}
|
|
#[allow(unused_variables, unused_mut, non_snake_case, unused_unsafe)]
|
|
#[no_mangle]
|
|
pub extern "C" fn Java_net_mbess_popequer_JNIReachabilityFence_reachabilityFence3(
|
|
_env: *mut JNIEnv,
|
|
_: jclass,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
) {
|
|
}
|
|
#[allow(unused_variables, unused_mut, non_snake_case, unused_unsafe)]
|
|
#[no_mangle]
|
|
pub extern "C" fn Java_net_mbess_popequer_JNIReachabilityFence_reachabilityFence4(
|
|
_env: *mut JNIEnv,
|
|
_: jclass,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
) {
|
|
}
|
|
#[allow(unused_variables, unused_mut, non_snake_case, unused_unsafe)]
|
|
#[no_mangle]
|
|
pub extern "C" fn Java_net_mbess_popequer_JNIReachabilityFence_reachabilityFence5(
|
|
_env: *mut JNIEnv,
|
|
_: jclass,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
) {
|
|
}
|
|
#[allow(unused_variables, unused_mut, non_snake_case, unused_unsafe)]
|
|
#[no_mangle]
|
|
pub extern "C" fn Java_net_mbess_popequer_JNIReachabilityFence_reachabilityFence6(
|
|
_env: *mut JNIEnv,
|
|
_: jclass,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
) {
|
|
}
|
|
#[allow(unused_variables, unused_mut, non_snake_case, unused_unsafe)]
|
|
#[no_mangle]
|
|
pub extern "C" fn Java_net_mbess_popequer_JNIReachabilityFence_reachabilityFence7(
|
|
_env: *mut JNIEnv,
|
|
_: jclass,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
) {
|
|
}
|
|
#[allow(unused_variables, unused_mut, non_snake_case, unused_unsafe)]
|
|
#[no_mangle]
|
|
pub extern "C" fn Java_net_mbess_popequer_JNIReachabilityFence_reachabilityFence8(
|
|
_env: *mut JNIEnv,
|
|
_: jclass,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
_: jobject,
|
|
) {
|
|
}
|
|
impl SwigForeignClass for Foo {
|
|
type PointedType = Foo;
|
|
fn jni_class() -> jclass {
|
|
swig_jni_find_class!(FOREIGN_CLASS_FOO, "net/mbess/popequer/Foo")
|
|
}
|
|
fn jni_class_pointer_field() -> jfieldID {
|
|
swig_jni_get_field_id!(
|
|
FOREIGN_CLASS_FOO_MNATIVEOBJ_FIELD,
|
|
FOREIGN_CLASS_FOO,
|
|
"mNativeObj",
|
|
"J"
|
|
)
|
|
}
|
|
fn box_object(this: Self) -> jlong {
|
|
let this: Box<Foo> = Box::new(this);
|
|
let this: *mut Foo = Box::into_raw(this);
|
|
this as jlong
|
|
}
|
|
fn unbox_object(x: jlong) -> Self {
|
|
let x: *mut Foo = unsafe { jlong_to_pointer::<Foo>(x).as_mut().unwrap() };
|
|
let x: Box<Foo> = unsafe { Box::from_raw(x) };
|
|
let x: Foo = *x;
|
|
x
|
|
}
|
|
fn to_pointer(x: jlong) -> ::std::ptr::NonNull<Self::PointedType> {
|
|
let x: *mut Foo = unsafe { jlong_to_pointer::<Foo>(x).as_mut().unwrap() };
|
|
::std::ptr::NonNull::<Self::PointedType>::new(x).unwrap()
|
|
}
|
|
}
|
|
#[allow(unused_variables, unused_mut, non_snake_case, unused_unsafe)]
|
|
#[no_mangle]
|
|
pub extern "C" fn Java_net_mbess_popequer_Foo_init(
|
|
env: *mut JNIEnv,
|
|
_: jclass,
|
|
val: jint,
|
|
) -> jlong {
|
|
let mut val: i32 = val;
|
|
let this: Foo = Foo::new(val);
|
|
let this: Box<Foo> = Box::new(this);
|
|
let this: *mut Foo = Box::into_raw(this);
|
|
this as jlong
|
|
}
|
|
#[allow(non_snake_case, unused_variables, unused_mut, unused_unsafe)]
|
|
#[no_mangle]
|
|
pub extern "C" fn Java_net_mbess_popequer_Foo_do_1f(
|
|
env: *mut JNIEnv,
|
|
_: jclass,
|
|
this: jlong,
|
|
a: jint,
|
|
b: jint,
|
|
) -> jint {
|
|
let mut a: i32 = a;
|
|
let mut b: i32 = b;
|
|
let this: &Foo = unsafe { jlong_to_pointer::<Foo>(this).as_mut().unwrap() };
|
|
let mut ret: i32 = Foo::f(this, a, b);
|
|
let mut ret: jint = ret;
|
|
ret
|
|
}
|
|
#[allow(non_snake_case, unused_variables, unused_mut, unused_unsafe)]
|
|
#[no_mangle]
|
|
pub extern "C" fn Java_net_mbess_popequer_Foo_do_1setField(
|
|
env: *mut JNIEnv,
|
|
_: jclass,
|
|
this: jlong,
|
|
v: jint,
|
|
) -> () {
|
|
let mut v: i32 = v;
|
|
let this: &mut Foo = unsafe { jlong_to_pointer::<Foo>(this).as_mut().unwrap() };
|
|
let mut ret: () = Foo::set_field(this, v);
|
|
ret
|
|
}
|
|
#[allow(unused_variables, unused_mut, non_snake_case, unused_unsafe)]
|
|
#[no_mangle]
|
|
pub extern "C" fn Java_net_mbess_popequer_Foo_do_1delete(env: *mut JNIEnv, _: jclass, this: jlong) {
|
|
let this: *mut Foo = unsafe { jlong_to_pointer::<Foo>(this).as_mut().unwrap() };
|
|
let this: Box<Foo> = unsafe { Box::from_raw(this) };
|
|
drop(this);
|
|
}
|
|
static mut JAVA_LANG_EXCEPTION: jclass = ::std::ptr::null_mut();
|
|
static mut JAVA_UTIL_OPTIONAL_DOUBLE: jclass = ::std::ptr::null_mut();
|
|
static mut JAVA_UTIL_OPTIONAL_DOUBLE_OF: jmethodID = ::std::ptr::null_mut();
|
|
static mut JAVA_UTIL_OPTIONAL_DOUBLE_EMPTY: jmethodID = ::std::ptr::null_mut();
|
|
static mut JAVA_LANG_STRING: jclass = ::std::ptr::null_mut();
|
|
static mut JAVA_UTIL_OPTIONAL_LONG: jclass = ::std::ptr::null_mut();
|
|
static mut JAVA_UTIL_OPTIONAL_LONG_OF: jmethodID = ::std::ptr::null_mut();
|
|
static mut JAVA_UTIL_OPTIONAL_LONG_EMPTY: jmethodID = ::std::ptr::null_mut();
|
|
static mut JAVA_LANG_LONG: jclass = ::std::ptr::null_mut();
|
|
static mut JAVA_LANG_LONG_LONG_VALUE: jmethodID = ::std::ptr::null_mut();
|
|
static mut JAVA_LANG_BYTE: jclass = ::std::ptr::null_mut();
|
|
static mut JAVA_LANG_BYTE_BYTE_VALUE: jmethodID = ::std::ptr::null_mut();
|
|
static mut JAVA_LANG_DOUBLE: jclass = ::std::ptr::null_mut();
|
|
static mut JAVA_LANG_DOUBLE_DOUBLE_VALUE_METHOD: jmethodID = ::std::ptr::null_mut();
|
|
static mut FOREIGN_CLASS_FOO: jclass = ::std::ptr::null_mut();
|
|
static mut FOREIGN_CLASS_FOO_MNATIVEOBJ_FIELD: jfieldID = ::std::ptr::null_mut();
|
|
static mut JAVA_LANG_FLOAT: jclass = ::std::ptr::null_mut();
|
|
static mut JAVA_LANG_FLOAT_FLOAT_VALUE: jmethodID = ::std::ptr::null_mut();
|
|
static mut JAVA_UTIL_OPTIONAL_INT: jclass = ::std::ptr::null_mut();
|
|
static mut JAVA_UTIL_OPTIONAL_INT_OF: jmethodID = ::std::ptr::null_mut();
|
|
static mut JAVA_UTIL_OPTIONAL_INT_EMPTY: jmethodID = ::std::ptr::null_mut();
|
|
static mut JAVA_LANG_INTEGER: jclass = ::std::ptr::null_mut();
|
|
static mut JAVA_LANG_INTEGER_INT_VALUE: jmethodID = ::std::ptr::null_mut();
|
|
static mut JAVA_LANG_SHORT: jclass = ::std::ptr::null_mut();
|
|
static mut JAVA_LANG_SHORT_SHORT_VALUE: jmethodID = ::std::ptr::null_mut();
|
|
#[no_mangle]
|
|
pub extern "system" fn JNI_OnLoad(
|
|
java_vm: *mut JavaVM,
|
|
_reserved: *mut ::std::os::raw::c_void,
|
|
) -> jint {
|
|
log::debug!("JNI_OnLoad begin");
|
|
assert!(!java_vm.is_null());
|
|
let mut env: *mut JNIEnv = ::std::ptr::null_mut();
|
|
let res = unsafe {
|
|
(**java_vm).GetEnv.unwrap()(
|
|
java_vm,
|
|
(&mut env) as *mut *mut JNIEnv as *mut *mut ::std::os::raw::c_void,
|
|
SWIG_JNI_VERSION,
|
|
)
|
|
};
|
|
if res != (JNI_OK as jint) {
|
|
panic!("JNI GetEnv in JNI_OnLoad failed, return code {}", res);
|
|
}
|
|
assert!(!env.is_null());
|
|
unsafe {
|
|
let class_local_ref = (**env).FindClass.unwrap()(env, swig_c_str!("java/lang/Exception"));
|
|
assert!(
|
|
!class_local_ref.is_null(),
|
|
concat!("FindClass failed for ", "java/lang/Exception")
|
|
);
|
|
let class = (**env).NewGlobalRef.unwrap()(env, class_local_ref);
|
|
assert!(
|
|
!class.is_null(),
|
|
concat!("FindClass failed for ", "java/lang/Exception")
|
|
);
|
|
(**env).DeleteLocalRef.unwrap()(env, class_local_ref);
|
|
JAVA_LANG_EXCEPTION = class;
|
|
}
|
|
unsafe {
|
|
let class_local_ref =
|
|
(**env).FindClass.unwrap()(env, swig_c_str!("java/util/OptionalDouble"));
|
|
assert!(
|
|
!class_local_ref.is_null(),
|
|
concat!("FindClass failed for ", "java/util/OptionalDouble")
|
|
);
|
|
let class = (**env).NewGlobalRef.unwrap()(env, class_local_ref);
|
|
assert!(
|
|
!class.is_null(),
|
|
concat!("FindClass failed for ", "java/util/OptionalDouble")
|
|
);
|
|
(**env).DeleteLocalRef.unwrap()(env, class_local_ref);
|
|
JAVA_UTIL_OPTIONAL_DOUBLE = class;
|
|
let method_id: jmethodID = (**env).GetStaticMethodID.unwrap()(
|
|
env,
|
|
class,
|
|
swig_c_str!("of"),
|
|
swig_c_str!("(D)Ljava/util/OptionalDouble;"),
|
|
);
|
|
assert!(
|
|
!method_id.is_null(),
|
|
concat!(
|
|
"GetStaticMethodID for class ",
|
|
"java/util/OptionalDouble",
|
|
" method ",
|
|
"of",
|
|
" sig ",
|
|
"(D)Ljava/util/OptionalDouble;",
|
|
" failed"
|
|
)
|
|
);
|
|
JAVA_UTIL_OPTIONAL_DOUBLE_OF = method_id;
|
|
let method_id: jmethodID = (**env).GetStaticMethodID.unwrap()(
|
|
env,
|
|
class,
|
|
swig_c_str!("empty"),
|
|
swig_c_str!("()Ljava/util/OptionalDouble;"),
|
|
);
|
|
assert!(
|
|
!method_id.is_null(),
|
|
concat!(
|
|
"GetStaticMethodID for class ",
|
|
"java/util/OptionalDouble",
|
|
" method ",
|
|
"empty",
|
|
" sig ",
|
|
"()Ljava/util/OptionalDouble;",
|
|
" failed"
|
|
)
|
|
);
|
|
JAVA_UTIL_OPTIONAL_DOUBLE_EMPTY = method_id;
|
|
}
|
|
unsafe {
|
|
let class_local_ref = (**env).FindClass.unwrap()(env, swig_c_str!("java/lang/String"));
|
|
assert!(
|
|
!class_local_ref.is_null(),
|
|
concat!("FindClass failed for ", "java/lang/String")
|
|
);
|
|
let class = (**env).NewGlobalRef.unwrap()(env, class_local_ref);
|
|
assert!(
|
|
!class.is_null(),
|
|
concat!("FindClass failed for ", "java/lang/String")
|
|
);
|
|
(**env).DeleteLocalRef.unwrap()(env, class_local_ref);
|
|
JAVA_LANG_STRING = class;
|
|
}
|
|
unsafe {
|
|
let class_local_ref =
|
|
(**env).FindClass.unwrap()(env, swig_c_str!("java/util/OptionalLong"));
|
|
assert!(
|
|
!class_local_ref.is_null(),
|
|
concat!("FindClass failed for ", "java/util/OptionalLong")
|
|
);
|
|
let class = (**env).NewGlobalRef.unwrap()(env, class_local_ref);
|
|
assert!(
|
|
!class.is_null(),
|
|
concat!("FindClass failed for ", "java/util/OptionalLong")
|
|
);
|
|
(**env).DeleteLocalRef.unwrap()(env, class_local_ref);
|
|
JAVA_UTIL_OPTIONAL_LONG = class;
|
|
let method_id: jmethodID = (**env).GetStaticMethodID.unwrap()(
|
|
env,
|
|
class,
|
|
swig_c_str!("of"),
|
|
swig_c_str!("(J)Ljava/util/OptionalLong;"),
|
|
);
|
|
assert!(
|
|
!method_id.is_null(),
|
|
concat!(
|
|
"GetStaticMethodID for class ",
|
|
"java/util/OptionalLong",
|
|
" method ",
|
|
"of",
|
|
" sig ",
|
|
"(J)Ljava/util/OptionalLong;",
|
|
" failed"
|
|
)
|
|
);
|
|
JAVA_UTIL_OPTIONAL_LONG_OF = method_id;
|
|
let method_id: jmethodID = (**env).GetStaticMethodID.unwrap()(
|
|
env,
|
|
class,
|
|
swig_c_str!("empty"),
|
|
swig_c_str!("()Ljava/util/OptionalLong;"),
|
|
);
|
|
assert!(
|
|
!method_id.is_null(),
|
|
concat!(
|
|
"GetStaticMethodID for class ",
|
|
"java/util/OptionalLong",
|
|
" method ",
|
|
"empty",
|
|
" sig ",
|
|
"()Ljava/util/OptionalLong;",
|
|
" failed"
|
|
)
|
|
);
|
|
JAVA_UTIL_OPTIONAL_LONG_EMPTY = method_id;
|
|
}
|
|
unsafe {
|
|
let class_local_ref = (**env).FindClass.unwrap()(env, swig_c_str!("java/lang/Long"));
|
|
assert!(
|
|
!class_local_ref.is_null(),
|
|
concat!("FindClass failed for ", "java/lang/Long")
|
|
);
|
|
let class = (**env).NewGlobalRef.unwrap()(env, class_local_ref);
|
|
assert!(
|
|
!class.is_null(),
|
|
concat!("FindClass failed for ", "java/lang/Long")
|
|
);
|
|
(**env).DeleteLocalRef.unwrap()(env, class_local_ref);
|
|
JAVA_LANG_LONG = class;
|
|
let method_id: jmethodID =
|
|
(**env).GetMethodID.unwrap()(env, class, swig_c_str!("longValue"), swig_c_str!("()J"));
|
|
assert!(
|
|
!method_id.is_null(),
|
|
concat!(
|
|
"GetMethodID for class ",
|
|
"java/lang/Long",
|
|
" method ",
|
|
"longValue",
|
|
" sig ",
|
|
"()J",
|
|
" failed"
|
|
)
|
|
);
|
|
JAVA_LANG_LONG_LONG_VALUE = method_id;
|
|
}
|
|
unsafe {
|
|
let class_local_ref = (**env).FindClass.unwrap()(env, swig_c_str!("java/lang/Byte"));
|
|
assert!(
|
|
!class_local_ref.is_null(),
|
|
concat!("FindClass failed for ", "java/lang/Byte")
|
|
);
|
|
let class = (**env).NewGlobalRef.unwrap()(env, class_local_ref);
|
|
assert!(
|
|
!class.is_null(),
|
|
concat!("FindClass failed for ", "java/lang/Byte")
|
|
);
|
|
(**env).DeleteLocalRef.unwrap()(env, class_local_ref);
|
|
JAVA_LANG_BYTE = class;
|
|
let method_id: jmethodID =
|
|
(**env).GetMethodID.unwrap()(env, class, swig_c_str!("byteValue"), swig_c_str!("()B"));
|
|
assert!(
|
|
!method_id.is_null(),
|
|
concat!(
|
|
"GetMethodID for class ",
|
|
"java/lang/Byte",
|
|
" method ",
|
|
"byteValue",
|
|
" sig ",
|
|
"()B",
|
|
" failed"
|
|
)
|
|
);
|
|
JAVA_LANG_BYTE_BYTE_VALUE = method_id;
|
|
}
|
|
unsafe {
|
|
let class_local_ref = (**env).FindClass.unwrap()(env, swig_c_str!("java/lang/Double"));
|
|
assert!(
|
|
!class_local_ref.is_null(),
|
|
concat!("FindClass failed for ", "java/lang/Double")
|
|
);
|
|
let class = (**env).NewGlobalRef.unwrap()(env, class_local_ref);
|
|
assert!(
|
|
!class.is_null(),
|
|
concat!("FindClass failed for ", "java/lang/Double")
|
|
);
|
|
(**env).DeleteLocalRef.unwrap()(env, class_local_ref);
|
|
JAVA_LANG_DOUBLE = class;
|
|
let method_id: jmethodID = (**env).GetMethodID.unwrap()(
|
|
env,
|
|
class,
|
|
swig_c_str!("doubleValue"),
|
|
swig_c_str!("()D"),
|
|
);
|
|
assert!(
|
|
!method_id.is_null(),
|
|
concat!(
|
|
"GetMethodID for class ",
|
|
"java/lang/Double",
|
|
" method ",
|
|
"doubleValue",
|
|
" sig ",
|
|
"()D",
|
|
" failed"
|
|
)
|
|
);
|
|
JAVA_LANG_DOUBLE_DOUBLE_VALUE_METHOD = method_id;
|
|
}
|
|
unsafe {
|
|
let class_local_ref =
|
|
(**env).FindClass.unwrap()(env, swig_c_str!("net/mbess/popequer/Foo"));
|
|
assert!(
|
|
!class_local_ref.is_null(),
|
|
concat!("FindClass failed for ", "net/mbess/popequer/Foo")
|
|
);
|
|
let class = (**env).NewGlobalRef.unwrap()(env, class_local_ref);
|
|
assert!(
|
|
!class.is_null(),
|
|
concat!("FindClass failed for ", "net/mbess/popequer/Foo")
|
|
);
|
|
(**env).DeleteLocalRef.unwrap()(env, class_local_ref);
|
|
FOREIGN_CLASS_FOO = class;
|
|
let field_id: jfieldID =
|
|
(**env).GetFieldID.unwrap()(env, class, swig_c_str!("mNativeObj"), swig_c_str!("J"));
|
|
assert!(
|
|
!field_id.is_null(),
|
|
concat!(
|
|
"GetStaticFieldID for class ",
|
|
"net/mbess/popequer/Foo",
|
|
" method ",
|
|
"mNativeObj",
|
|
" sig ",
|
|
"J",
|
|
" failed"
|
|
)
|
|
);
|
|
FOREIGN_CLASS_FOO_MNATIVEOBJ_FIELD = field_id;
|
|
}
|
|
unsafe {
|
|
let class_local_ref = (**env).FindClass.unwrap()(env, swig_c_str!("java/lang/Float"));
|
|
assert!(
|
|
!class_local_ref.is_null(),
|
|
concat!("FindClass failed for ", "java/lang/Float")
|
|
);
|
|
let class = (**env).NewGlobalRef.unwrap()(env, class_local_ref);
|
|
assert!(
|
|
!class.is_null(),
|
|
concat!("FindClass failed for ", "java/lang/Float")
|
|
);
|
|
(**env).DeleteLocalRef.unwrap()(env, class_local_ref);
|
|
JAVA_LANG_FLOAT = class;
|
|
let method_id: jmethodID =
|
|
(**env).GetMethodID.unwrap()(env, class, swig_c_str!("floatValue"), swig_c_str!("()F"));
|
|
assert!(
|
|
!method_id.is_null(),
|
|
concat!(
|
|
"GetMethodID for class ",
|
|
"java/lang/Float",
|
|
" method ",
|
|
"floatValue",
|
|
" sig ",
|
|
"()F",
|
|
" failed"
|
|
)
|
|
);
|
|
JAVA_LANG_FLOAT_FLOAT_VALUE = method_id;
|
|
}
|
|
unsafe {
|
|
let class_local_ref = (**env).FindClass.unwrap()(env, swig_c_str!("java/util/OptionalInt"));
|
|
assert!(
|
|
!class_local_ref.is_null(),
|
|
concat!("FindClass failed for ", "java/util/OptionalInt")
|
|
);
|
|
let class = (**env).NewGlobalRef.unwrap()(env, class_local_ref);
|
|
assert!(
|
|
!class.is_null(),
|
|
concat!("FindClass failed for ", "java/util/OptionalInt")
|
|
);
|
|
(**env).DeleteLocalRef.unwrap()(env, class_local_ref);
|
|
JAVA_UTIL_OPTIONAL_INT = class;
|
|
let method_id: jmethodID = (**env).GetStaticMethodID.unwrap()(
|
|
env,
|
|
class,
|
|
swig_c_str!("of"),
|
|
swig_c_str!("(I)Ljava/util/OptionalInt;"),
|
|
);
|
|
assert!(
|
|
!method_id.is_null(),
|
|
concat!(
|
|
"GetStaticMethodID for class ",
|
|
"java/util/OptionalInt",
|
|
" method ",
|
|
"of",
|
|
" sig ",
|
|
"(I)Ljava/util/OptionalInt;",
|
|
" failed"
|
|
)
|
|
);
|
|
JAVA_UTIL_OPTIONAL_INT_OF = method_id;
|
|
let method_id: jmethodID = (**env).GetStaticMethodID.unwrap()(
|
|
env,
|
|
class,
|
|
swig_c_str!("empty"),
|
|
swig_c_str!("()Ljava/util/OptionalInt;"),
|
|
);
|
|
assert!(
|
|
!method_id.is_null(),
|
|
concat!(
|
|
"GetStaticMethodID for class ",
|
|
"java/util/OptionalInt",
|
|
" method ",
|
|
"empty",
|
|
" sig ",
|
|
"()Ljava/util/OptionalInt;",
|
|
" failed"
|
|
)
|
|
);
|
|
JAVA_UTIL_OPTIONAL_INT_EMPTY = method_id;
|
|
}
|
|
unsafe {
|
|
let class_local_ref = (**env).FindClass.unwrap()(env, swig_c_str!("java/lang/Integer"));
|
|
assert!(
|
|
!class_local_ref.is_null(),
|
|
concat!("FindClass failed for ", "java/lang/Integer")
|
|
);
|
|
let class = (**env).NewGlobalRef.unwrap()(env, class_local_ref);
|
|
assert!(
|
|
!class.is_null(),
|
|
concat!("FindClass failed for ", "java/lang/Integer")
|
|
);
|
|
(**env).DeleteLocalRef.unwrap()(env, class_local_ref);
|
|
JAVA_LANG_INTEGER = class;
|
|
let method_id: jmethodID =
|
|
(**env).GetMethodID.unwrap()(env, class, swig_c_str!("intValue"), swig_c_str!("()I"));
|
|
assert!(
|
|
!method_id.is_null(),
|
|
concat!(
|
|
"GetMethodID for class ",
|
|
"java/lang/Integer",
|
|
" method ",
|
|
"intValue",
|
|
" sig ",
|
|
"()I",
|
|
" failed"
|
|
)
|
|
);
|
|
JAVA_LANG_INTEGER_INT_VALUE = method_id;
|
|
}
|
|
unsafe {
|
|
let class_local_ref = (**env).FindClass.unwrap()(env, swig_c_str!("java/lang/Short"));
|
|
assert!(
|
|
!class_local_ref.is_null(),
|
|
concat!("FindClass failed for ", "java/lang/Short")
|
|
);
|
|
let class = (**env).NewGlobalRef.unwrap()(env, class_local_ref);
|
|
assert!(
|
|
!class.is_null(),
|
|
concat!("FindClass failed for ", "java/lang/Short")
|
|
);
|
|
(**env).DeleteLocalRef.unwrap()(env, class_local_ref);
|
|
JAVA_LANG_SHORT = class;
|
|
let method_id: jmethodID =
|
|
(**env).GetMethodID.unwrap()(env, class, swig_c_str!("shortValue"), swig_c_str!("()S"));
|
|
assert!(
|
|
!method_id.is_null(),
|
|
concat!(
|
|
"GetMethodID for class ",
|
|
"java/lang/Short",
|
|
" method ",
|
|
"shortValue",
|
|
" sig ",
|
|
"()S",
|
|
" failed"
|
|
)
|
|
);
|
|
JAVA_LANG_SHORT_SHORT_VALUE = method_id;
|
|
}
|
|
SWIG_JNI_VERSION
|
|
}
|
|
#[no_mangle]
|
|
pub extern "system" fn JNI_OnUnload(java_vm: *mut JavaVM, _reserved: *mut ::std::os::raw::c_void) {
|
|
log::debug!("JNI_OnUnLoad begin");
|
|
assert!(!java_vm.is_null());
|
|
let mut env: *mut JNIEnv = ::std::ptr::null_mut();
|
|
let res = unsafe {
|
|
(**java_vm).GetEnv.unwrap()(
|
|
java_vm,
|
|
(&mut env) as *mut *mut JNIEnv as *mut *mut ::std::os::raw::c_void,
|
|
SWIG_JNI_VERSION,
|
|
)
|
|
};
|
|
if res != (JNI_OK as jint) {
|
|
panic!("JNI GetEnv in JNI_OnLoad failed, return code {}", res);
|
|
}
|
|
assert!(!env.is_null());
|
|
unsafe {
|
|
(**env).DeleteGlobalRef.unwrap()(env, JAVA_LANG_EXCEPTION);
|
|
JAVA_LANG_EXCEPTION = ::std::ptr::null_mut()
|
|
}
|
|
unsafe {
|
|
(**env).DeleteGlobalRef.unwrap()(env, JAVA_UTIL_OPTIONAL_DOUBLE);
|
|
JAVA_UTIL_OPTIONAL_DOUBLE = ::std::ptr::null_mut()
|
|
}
|
|
unsafe {
|
|
(**env).DeleteGlobalRef.unwrap()(env, JAVA_LANG_STRING);
|
|
JAVA_LANG_STRING = ::std::ptr::null_mut()
|
|
}
|
|
unsafe {
|
|
(**env).DeleteGlobalRef.unwrap()(env, JAVA_UTIL_OPTIONAL_LONG);
|
|
JAVA_UTIL_OPTIONAL_LONG = ::std::ptr::null_mut()
|
|
}
|
|
unsafe {
|
|
(**env).DeleteGlobalRef.unwrap()(env, JAVA_LANG_LONG);
|
|
JAVA_LANG_LONG = ::std::ptr::null_mut()
|
|
}
|
|
unsafe {
|
|
(**env).DeleteGlobalRef.unwrap()(env, JAVA_LANG_BYTE);
|
|
JAVA_LANG_BYTE = ::std::ptr::null_mut()
|
|
}
|
|
unsafe {
|
|
(**env).DeleteGlobalRef.unwrap()(env, JAVA_LANG_DOUBLE);
|
|
JAVA_LANG_DOUBLE = ::std::ptr::null_mut()
|
|
}
|
|
unsafe {
|
|
(**env).DeleteGlobalRef.unwrap()(env, FOREIGN_CLASS_FOO);
|
|
FOREIGN_CLASS_FOO = ::std::ptr::null_mut()
|
|
}
|
|
unsafe {
|
|
(**env).DeleteGlobalRef.unwrap()(env, JAVA_LANG_FLOAT);
|
|
JAVA_LANG_FLOAT = ::std::ptr::null_mut()
|
|
}
|
|
unsafe {
|
|
(**env).DeleteGlobalRef.unwrap()(env, JAVA_UTIL_OPTIONAL_INT);
|
|
JAVA_UTIL_OPTIONAL_INT = ::std::ptr::null_mut()
|
|
}
|
|
unsafe {
|
|
(**env).DeleteGlobalRef.unwrap()(env, JAVA_LANG_INTEGER);
|
|
JAVA_LANG_INTEGER = ::std::ptr::null_mut()
|
|
}
|
|
unsafe {
|
|
(**env).DeleteGlobalRef.unwrap()(env, JAVA_LANG_SHORT);
|
|
JAVA_LANG_SHORT = ::std::ptr::null_mut()
|
|
}
|
|
}
|