1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
use core::fmt;
use swim_c::cstr::CStr;
use swim_jvm_sys::{jobject, jclass, jvalue};
use crate::error::Result;
use crate::class::JClass;
use crate::method::JMethod;
use crate::env::JEnv;
use crate::convert::{FromJava, IntoJava, TryFromJava, TryIntoJava};
#[derive(Clone, Copy, Eq)]
pub struct JObject {
env: JEnv,
obj: jobject,
}
unsafe impl Send for JObject {}
unsafe impl Sync for JObject {}
impl JObject {
#[inline]
pub fn get_env(&self) -> &JEnv {
&self.env
}
#[inline]
pub fn get_class(&self) -> Result<JClass> {
self.env.get_object_class(self)
}
#[inline]
pub fn instance_of<C>(&self, cls: C) -> bool where C: Into<jclass> {
self.env.is_instance_of(self, cls)
}
#[inline]
pub fn get_method<S, T>(&self, name: S, sig: T) -> Result<JMethod>
where S: AsRef<CStr>, T: AsRef<CStr> {
let class = self.get_class()?;
class.get_method(name, sig)
}
}
impl PartialEq for JObject {
#[inline]
fn eq(&self, other: &JObject) -> bool {
self.env == other.env && self.env.is_same_object(self, other)
}
}
impl fmt::Debug for JObject {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:p}", self.obj)
}
}
impl FromJava<jobject> for JObject {
#[inline]
fn from_java(env: &JEnv, obj: jobject) -> Self {
Self {
env: env.clone(),
obj: obj,
}
}
}
impl TryFromJava<jobject> for JObject {
#[inline]
fn try_from_java(env: &JEnv, obj: jobject) -> Result<Self> {
Ok(Self::from_java(env, obj))
}
}
impl IntoJava<jobject> for JObject {
#[inline]
fn into_java(self, _env: &JEnv) -> jobject {
self.obj
}
}
impl<'a> IntoJava<jobject> for &'a JObject {
#[inline]
fn into_java(self, _env: &JEnv) -> jobject {
self.obj
}
}
impl TryIntoJava<jobject> for JObject {
#[inline]
fn try_into_java(self, _env: &JEnv) -> Result<jobject> {
Ok(self.obj)
}
}
impl<'a> TryIntoJava<jobject> for &'a JObject {
#[inline]
fn try_into_java(self, _env: &JEnv) -> Result<jobject> {
Ok(self.obj)
}
}
impl Into<jobject> for JObject {
#[inline]
fn into(self) -> jobject {
self.obj
}
}
impl<'a> Into<jobject> for &'a JObject {
#[inline]
fn into(self) -> jobject {
self.obj
}
}
impl Into<jvalue> for JObject {
#[inline]
fn into(self) -> jvalue {
jvalue { l: self.obj }
}
}
impl<'a> Into<jvalue> for &'a JObject {
#[inline]
fn into(self) -> jvalue {
jvalue { l: self.obj }
}
}