1
- use jni:: { errors:: Error , objects:: JObject , JNIEnv } ;
2
-
3
- struct Inner < ' env > {
4
- env : JNIEnv < ' env > ,
1
+ use jni:: {
2
+ errors:: Error ,
3
+ objects:: { JObject , JString , JValue } ,
4
+ JNIEnv ,
5
+ } ;
6
+
7
+ struct Inner < ' vm , ' env > {
8
+ env : & ' vm mut JNIEnv < ' env > ,
5
9
object : JObject < ' env > ,
6
10
}
7
11
8
12
/// A messaging object you can use to request an action from another android app component.
9
13
#[ must_use]
10
- pub struct Intent < ' env > {
11
- inner : Result < Inner < ' env > , Error > ,
14
+ pub struct Intent < ' vm , ' env > {
15
+ inner : Result < Inner < ' vm , ' env > , Error > ,
12
16
}
13
17
14
- impl < ' env > Intent < ' env > {
15
- pub fn from_object ( env : JNIEnv < ' env > , object : JObject < ' env > ) -> Self {
18
+ impl < ' vm , ' env > Intent < ' vm , ' env > {
19
+ pub fn from_object ( env : & ' vm mut JNIEnv < ' env > , object : JObject < ' env > ) -> Self {
16
20
Self {
17
21
inner : Ok ( Inner { env, object } ) ,
18
22
}
19
23
}
20
24
21
- fn from_fn ( f : impl FnOnce ( ) -> Result < Inner < ' env > , Error > ) -> Self {
25
+ fn from_fn ( f : impl FnOnce ( ) -> Result < Inner < ' vm , ' env > , Error > ) -> Self {
22
26
let inner = f ( ) ;
23
27
Self { inner }
24
28
}
25
29
26
- pub fn new ( env : JNIEnv < ' env > , action : impl AsRef < str > ) -> Self {
30
+ pub fn new ( env : & ' vm mut JNIEnv < ' env > , action : impl AsRef < str > ) -> Self {
27
31
Self :: from_fn ( || {
28
32
let intent_class = env. find_class ( "android/content/Intent" ) ?;
29
33
let action_view =
30
- env. get_static_field ( intent_class, action. as_ref ( ) , "Ljava/lang/String;" ) ?;
34
+ env. get_static_field ( & intent_class, action. as_ref ( ) , "Ljava/lang/String;" ) ?;
31
35
32
- let intent = env. new_object ( intent_class, "(Ljava/lang/String;)V" , & [ action_view] ) ?;
36
+ let intent = env. new_object (
37
+ & intent_class,
38
+ "(Ljava/lang/String;)V" ,
39
+ & [ action_view. borrow ( ) ] ,
40
+ ) ?;
33
41
34
42
Ok ( Inner {
35
43
env,
@@ -38,25 +46,30 @@ impl<'env> Intent<'env> {
38
46
} )
39
47
}
40
48
41
- pub fn new_with_uri ( env : JNIEnv < ' env > , action : impl AsRef < str > , uri : impl AsRef < str > ) -> Self {
49
+ pub fn new_with_uri (
50
+ env : & ' env mut JNIEnv < ' env > ,
51
+ action : impl AsRef < str > ,
52
+ uri : impl AsRef < str > ,
53
+ ) -> Self {
42
54
Self :: from_fn ( || {
43
55
let url_string = env. new_string ( uri) ?;
44
56
let uri_class = env. find_class ( "android/net/Uri" ) ?;
45
57
let uri = env. call_static_method (
46
58
uri_class,
47
59
"parse" ,
48
60
"(Ljava/lang/String;)Landroid/net/Uri;" ,
49
- & [ url_string . into ( ) ] ,
61
+ & [ JValue :: Object ( & url_string ) ] ,
50
62
) ?;
51
63
52
64
let intent_class = env. find_class ( "android/content/Intent" ) ?;
53
- let action_view =
54
- env. get_static_field ( intent_class, action. as_ref ( ) , "Ljava/lang/String;" ) ?;
65
+ let action_view = env
66
+ . get_static_field ( & intent_class, action. as_ref ( ) , "Ljava/lang/String;" ) ?
67
+ . l ( ) ?;
55
68
56
69
let intent = env. new_object (
57
- intent_class,
70
+ & intent_class,
58
71
"(Ljava/lang/String;Landroid/net/Uri;)V" ,
59
- & [ action_view, uri] ,
72
+ & [ JValue :: Object ( & action_view) , uri. borrow ( ) ] ,
60
73
) ?;
61
74
62
75
Ok ( Inner {
@@ -85,10 +98,10 @@ impl<'env> Intent<'env> {
85
98
let class_name = inner. env . new_string ( class_name) ?;
86
99
87
100
inner. env . call_method (
88
- inner. object ,
101
+ & inner. object ,
89
102
"setClassName" ,
90
103
"(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;" ,
91
- & [ package_name . into ( ) , class_name . into ( ) ] ,
104
+ & [ JValue :: Object ( & package_name ) , JValue :: Object ( & class_name ) ] ,
92
105
) ?;
93
106
94
107
Ok ( inner)
@@ -110,10 +123,10 @@ impl<'env> Intent<'env> {
110
123
let value = inner. env . new_string ( value) ?;
111
124
112
125
inner. env . call_method (
113
- inner. object ,
126
+ & inner. object ,
114
127
"putExtra" ,
115
128
"(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;" ,
116
- & [ key . into ( ) , value . into ( ) ] ,
129
+ & [ JValue :: Object ( & key ) , JValue :: Object ( & value ) ] ,
117
130
) ?;
118
131
119
132
Ok ( inner)
@@ -136,18 +149,17 @@ impl<'env> Intent<'env> {
136
149
pub fn into_chooser_with_title ( self , title : Option < impl AsRef < str > > ) -> Self {
137
150
self . and_then ( |mut inner| {
138
151
let title_value = if let Some ( title) = title {
139
- let s = inner. env . new_string ( title) ?;
140
- s. into ( )
152
+ inner. env . new_string ( title) ?
141
153
} else {
142
- JObject :: null ( ) . into ( )
154
+ JString :: default ( )
143
155
} ;
144
156
145
157
let intent_class = inner. env . find_class ( "android/content/Intent" ) ?;
146
158
let intent = inner. env . call_static_method (
147
159
intent_class,
148
160
"createChooser" ,
149
161
"(Landroid/content/Intent;Ljava/lang/CharSequence;)Landroid/content/Intent;" ,
150
- & [ inner. object . into ( ) , title_value] ,
162
+ & [ JValue :: Object ( & inner. object ) , JValue :: Object ( & title_value) ] ,
151
163
) ?;
152
164
153
165
inner. object = intent. try_into ( ) ?;
@@ -169,10 +181,10 @@ impl<'env> Intent<'env> {
169
181
let jstring = inner. env . new_string ( type_name) ?;
170
182
171
183
inner. env . call_method (
172
- inner. object ,
184
+ & inner. object ,
173
185
"setType" ,
174
186
"(Ljava/lang/String;)Landroid/content/Intent;" ,
175
- & [ jstring . into ( ) ] ,
187
+ & [ JValue :: Object ( & jstring ) ] ,
176
188
) ?;
177
189
178
190
Ok ( inner)
@@ -188,14 +200,17 @@ impl<'env> Intent<'env> {
188
200
activity,
189
201
"startActivity" ,
190
202
"(Landroid/content/Intent;)V" ,
191
- & [ inner. object . into ( ) ] ,
203
+ & [ JValue :: Object ( & inner. object ) ] ,
192
204
) ?;
193
205
194
206
Ok ( ( ) )
195
207
} )
196
208
}
197
209
198
- fn and_then ( mut self , f : impl FnOnce ( Inner ) -> Result < Inner , Error > ) -> Self {
210
+ fn and_then (
211
+ mut self ,
212
+ f : impl FnOnce ( Inner < ' vm , ' env > ) -> Result < Inner < ' vm , ' env > , Error > ,
213
+ ) -> Self {
199
214
self . inner = self . inner . and_then ( f) ;
200
215
self
201
216
}
0 commit comments