#[macro_export]
macro_rules! java_interface {
(
interface = $interface:ident,
link = $link:expr,
extends = ($($($extended_interface:ident)::+),*),
methods = ($(
doc = $method_documentation:expr,
link = $method_link:expr,
java_name = $java_method_name:expr,
$method_name:ident
($($method_argument_name:ident: $method_argument_type:ty),*)
-> $method_result:ty,
)*),
) => {
#[doc = $link]
pub trait $interface<'env>: $($($extended_interface)::* <'env>),* {
$(
#[doc = $method_documentation]
///
#[doc = $method_link]
fn $method_name(
&self,
$($method_argument_name: $method_argument_type,)*
token: &::rust_jni::NoException<'env>,
) -> ::rust_jni::JavaResult<'env, $method_result>;
)*
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __generate_super_interface {
(
class = $class:ident,
class_link = $class_link:expr,
interface_link = $implemented_interface_link:expr,
extends = $super_class:path,
name = $($implemented_interface:ident)::+,
name_path = $implemented_interface_path:path,
methods = ($(
$interface_method_name:ident
($(
$interface_method_argument_name:ident:
$interface_method_argument_type:ty
),*) -> $interface_method_result:ty,
)*),
) => {
#[doc = $implemented_interface_link]
#[doc = $class_link]
impl<'env> $($implemented_interface)::* <'env> for $class<'env> {
$(
fn $interface_method_name(
&self,
$($interface_method_argument_name: $interface_method_argument_type),*,
token: &::rust_jni::NoException<'env>,
) -> ::rust_jni::JavaResult<'env, $interface_method_result> {
<$super_class as $implemented_interface>
::$interface_method_name(
self, $($interface_method_argument_name),*, token
)
}
)*
}
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! __generate_super_interfaces {
(
class = $class:ident,
class_link = $class_link:expr,
extends = $super_class:path,
interfaces = ($(
link = $implemented_interface_link:expr,
name = $($implemented_interface:ident)::+,
methods = ($(
$interface_method_name:ident
($(
$interface_method_argument_name:ident:
$interface_method_argument_type:ty
),*) -> $interface_method_result:ty,
)*),
)*),
) => {
$(
__generate_super_interface!(
class = $class,
class_link = $class_link,
interface_link = $implemented_interface_link,
extends = $super_class,
name = $($implemented_interface)::+,
name_path = $($implemented_interface)::+,
methods = ($(
$interface_method_name
($(
$interface_method_argument_name:
$interface_method_argument_type
),*) -> $interface_method_result,
)*),
);
)*
};
}
#[macro_export]
macro_rules! java_class {
(
package = $package:expr,
class = $class:ident,
link = $java_link:expr,
rust_link = $rust_link:expr,
extends = $($super_class:ident)::+,
super_link = $rust_super_link:expr,
implements = ($(
name = $($implemented_interface:ident)::+,
link = $implemented_interface_link:expr,
methods = ($(
$interface_method_name:ident
($(
$interface_method_argument_name:ident:
$interface_method_argument_type:ty
),*) -> $interface_method_result:ty,
)*),
)*),
constructors = ($(
doc = $constructor_documentation:expr,
link = $constructor_link:expr,
$constructor_name:ident
($($constructor_argument_name:ident: $constructor_argument_type:ty),*),
)*),
methods = ($(
doc = $method_documentation:expr,
link = $method_link:expr,
java_name = $java_method_name:expr,
$method_name:ident
($($method_argument_name:ident: $method_argument_type:ty),*)
-> $method_result:ty,
)*),
static_methods = ($(
doc = $static_method_documentation:expr,
link = $static_method_link:expr,
java_name = $java_static_method_name:expr,
$static_method_name:ident
($($static_method_argument_name:ident: $static_method_argument_type:ty),*)
-> $static_method_result:ty,
)*),
native_methods = ($(
function_name = $native_function_name:ident,
$native_method_name:ident
($($native_method_argument_name:ident: $native_method_argument_type:ty),*)
-> $native_method_result:ty,
)*),
static_native_methods = ($(
function_name = $static_native_function_name:ident,
$static_native_method_name:ident
($($static_native_method_argument_name:ident: $static_native_method_argument_type:ty),*)
-> $static_native_method_result:ty,
)*),
super_classes = ($(
$($super_super_class:ident)::+,
link = $super_super_class_link:expr
),*),
super_interfaces = ($(
name = $($implemented_super_interface:ident)::+,
link = $implemented_super_interface_link:expr,
methods = ($(
$super_interface_method_name:ident
($(
$super_interface_method_argument_name:ident:
$super_interface_method_argument_type:ty
),*) -> $super_interface_method_result:ty,
)*),
)*),
) => {
#[doc = $java_link]
#[derive(Debug)]
pub struct $class<'env> {
object: $($super_class)::* <'env>,
}
#[doc = $rust_link]
impl<'a> ::rust_jni::JavaType for $class<'a> {
#[doc(hidden)]
type __JniType = <::rust_jni::java::lang::Object<'a> as ::rust_jni::JavaType>::__JniType;
#[doc(hidden)]
fn __signature() -> &'static str {
concat!("L", $package, "/", stringify!($class), ";")
}
}
#[doc = $rust_link]
#[doc(hidden)]
impl<'a> ::rust_jni::__generator::ToJni for $class<'a> {
unsafe fn __to_jni(&self) -> Self::__JniType {
self.raw_object()
}
}
#[doc = $rust_link]
#[doc(hidden)]
impl<'env> ::rust_jni::__generator::FromJni<'env> for $class<'env> {
unsafe fn __from_jni(env: &'env ::rust_jni::JniEnv<'env>, value: Self::__JniType) -> Self {
Self {
object: <$($super_class)::* as ::rust_jni::__generator::FromJni<'env>>::__from_jni(env, value),
}
}
}
#[doc = $rust_link]
impl<'env> ::rust_jni::Cast<'env, $class<'env>> for $class<'env> {
#[doc(hidden)]
fn cast<'a>(&'a self) -> &'a $class<'env> {
self
}
}
#[doc = $rust_link]
#[doc = $rust_super_link]
impl<'env> ::rust_jni::Cast<'env, $($super_class)::*<'env>> for $class<'env> {
#[doc(hidden)]
fn cast<'a>(&'a self) -> &'a $($super_class)::*<'env> {
self
}
}
$(
#[doc = $rust_link]
#[doc = $super_super_class_link]
impl<'env> ::rust_jni::Cast<'env, $($super_super_class)::* <'env>> for $class<'env> {
#[doc(hidden)]
fn cast<'a>(&'a self) -> &'a $($super_super_class)::* <'env> {
self
}
}
)*
#[doc = $rust_link]
#[doc = $rust_super_link]
impl<'env> ::std::ops::Deref for $class<'env> {
type Target = $($super_class)::* <'env>;
fn deref(&self) -> &Self::Target {
&self.object
}
}
impl<'env> $class<'env> {
#[doc = $rust_link]
pub fn get_class(env: &'env ::rust_jni::JniEnv<'env>, token: &::rust_jni::NoException<'env>)
-> ::rust_jni::JavaResult<'env, ::rust_jni::java::lang::Class<'env>> {
::rust_jni::java::lang::Class::find(env, concat!($package, "/", stringify!($class)), token)
}
#[doc = $rust_link]
pub fn clone(&self, token: &::rust_jni::NoException<'env>) -> ::rust_jni::JavaResult<'env, Self>
where
Self: Sized,
{
<Self as ::rust_jni::Cast<$($super_class)::*>>::cast(self)
.clone(token)
.map(|object| Self { object })
}
pub fn to_string(&self, token: &::rust_jni::NoException<'env>)
-> ::rust_jni::JavaResult<'env, ::rust_jni::java::lang::String<'env>> {
<$class as ::rust_jni::Cast<::rust_jni::java::lang::Object>>::cast(self).to_string(token)
}
$(
#[doc = $constructor_documentation]
#[doc = $constructor_link]
pub fn $constructor_name(
env: &'env ::rust_jni::JniEnv<'env>,
$($constructor_argument_name: $constructor_argument_type,)*
token: &::rust_jni::NoException<'env>,
) -> ::rust_jni::JavaResult<'env, Self> {
unsafe {
::rust_jni::__generator::call_constructor::<Self, _, fn($($constructor_argument_type,)*)>
(
env,
($($constructor_argument_name,)*),
token,
)
}
}
)*
$(
#[doc = $method_documentation]
#[doc = $method_link]
pub fn $method_name(
&self,
$($method_argument_name: $method_argument_type,)*
token: &::rust_jni::NoException<'env>,
) -> ::rust_jni::JavaResult<'env, $method_result> {
unsafe {
::rust_jni::__generator::call_method::<_, _, _,
fn($($method_argument_type,)*) -> $method_result
>
(
self,
$java_method_name,
($($method_argument_name,)*),
token,
)
}
}
)*
$(
#[doc = $static_method_documentation]
#[doc = $static_method_link]
pub fn $static_method_name(
env: &'env ::rust_jni::JniEnv<'env>,
$($static_method_argument_name: $static_method_argument_type,)*
token: &::rust_jni::NoException<'env>,
) -> ::rust_jni::JavaResult<'env, $static_method_result> {
unsafe {
::rust_jni::__generator::call_static_method::<Self, _, _,
fn($($static_method_argument_type,)*) -> $static_method_result
>
(
env,
$java_static_method_name,
($($static_method_argument_name,)*),
token,
)
}
}
)*
}
$(
#[doc = $implemented_interface_link]
#[doc = $rust_link]
impl<'env> $($implemented_interface)::* <'env> for $class<'env> {
$(
fn $interface_method_name(
&self,
$($interface_method_argument_name: $interface_method_argument_type),*,
token: &::rust_jni::NoException<'env>,
) -> ::rust_jni::JavaResult<'env, $interface_method_result> {
Self::$interface_method_name(
self, $($interface_method_argument_name),*, token
)
}
)*
}
)*
__generate_super_interfaces!(
class = $class,
class_link = $rust_link,
extends = $($super_class)::+,
interfaces = ($(
link = $implemented_super_interface_link,
name = $($implemented_super_interface)::+,
methods = ($(
$super_interface_method_name
($(
$super_interface_method_argument_name:
$super_interface_method_argument_type
),*) -> $super_interface_method_result,
)*),
)*),
);
$(
#[no_mangle]
#[doc(hidden)]
pub unsafe extern "C" fn $native_function_name(
raw_env: *mut ::jni_sys::JNIEnv,
object: ::jni_sys::jobject,
$($native_method_argument_name: <$native_method_argument_type as ::rust_jni::JavaType>::__JniType,)*
) -> <$native_method_result as ::rust_jni::JavaType>::__JniType {
$(::rust_jni::__generator::test_jni_argument_type($native_method_argument_name);)*
::rust_jni::__generator::native_method_wrapper(raw_env, |env, token| {
$(
{
let value =
<$native_method_argument_type as ::rust_jni::__generator::FromJni>
::__from_jni(env, $native_method_argument_name);
::rust_jni::__generator::test_from_jni_type(&value);
::std::mem::forget(value);
}
)*
let object = <$class as ::rust_jni::__generator::FromJni>::__from_jni(env, object);
object
.$native_method_name(
$(::rust_jni::__generator::FromJni::__from_jni(env, $native_method_argument_name),)*
&token,
)
.map(|value| {
let result = ::rust_jni::__generator::ToJni::__to_jni(&value);
::std::mem::forget(value);
result
})
})
}
)*
$(
#[no_mangle]
#[doc(hidden)]
pub unsafe extern "C" fn $static_native_function_name(
raw_env: *mut ::jni_sys::JNIEnv,
raw_class: ::jni_sys::jclass,
$($static_native_method_argument_name: <$static_native_method_argument_type as ::rust_jni::JavaType>::__JniType,)*
) -> <$static_native_method_result as ::rust_jni::JavaType>::__JniType {
$(::rust_jni::__generator::test_jni_argument_type($static_native_method_argument_name);)*
::rust_jni::__generator::native_method_wrapper(raw_env, |env, token| {
$(
{
let value =
<$static_native_method_argument_type as ::rust_jni::__generator::FromJni>
::__from_jni(env, $static_native_method_argument_name);
::rust_jni::__generator::test_from_jni_type(&value);
::std::mem::forget(value);
}
)*
let class = $class::get_class(env, &token)?;
let raw_class = <::rust_jni::java::lang::Class as ::rust_jni::__generator::FromJni>::__from_jni(env, raw_class);
if !class.is_same_as(&raw_class, &token) {
panic!(concat!(
"Native method ",
stringify!($static_native_function_name),
" does not belong to class ",
$package, "/", stringify!($class),
));
}
$class::$static_native_method_name(
env,
$(::rust_jni::__generator::FromJni::__from_jni(env, $static_native_method_argument_name),)*
&token,
)
.map(|value| {
let result = ::rust_jni::__generator::ToJni::__to_jni(&value);
::std::mem::forget(value);
result
})
})
}
)*
#[doc = $rust_link]
impl<'env> ::std::fmt::Display for $class<'env> {
fn fmt(&self, formatter: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
<$class as ::rust_jni::Cast<::rust_jni::java::lang::Object>>::cast(self)
.fmt(formatter)
}
}
#[doc = $rust_link]
impl<'env, T> PartialEq<T> for $class<'env> where T: ::rust_jni::Cast<'env, ::rust_jni::java::lang::Object<'env>> {
fn eq(&self, other: &T) -> bool {
<$class as ::rust_jni::Cast<::rust_jni::java::lang::Object>>::cast(self)
.eq(other)
}
}
#[doc = $rust_link]
impl<'env> Eq for $class<'env> {}
};
}