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 > ,
59 object : JObject < ' env > ,
610}
711
812/// A messaging object you can use to request an action from another android app component.
913#[ 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 > ,
1216}
1317
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 {
1620 Self {
1721 inner : Ok ( Inner { env, object } ) ,
1822 }
1923 }
2024
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 {
2226 let inner = f ( ) ;
2327 Self { inner }
2428 }
2529
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 {
2731 Self :: from_fn ( || {
2832 let intent_class = env. find_class ( "android/content/Intent" ) ?;
2933 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;" ) ?;
3135
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+ ) ?;
3341
3442 Ok ( Inner {
3543 env,
@@ -38,25 +46,30 @@ impl<'env> Intent<'env> {
3846 } )
3947 }
4048
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 {
4254 Self :: from_fn ( || {
4355 let url_string = env. new_string ( uri) ?;
4456 let uri_class = env. find_class ( "android/net/Uri" ) ?;
4557 let uri = env. call_static_method (
4658 uri_class,
4759 "parse" ,
4860 "(Ljava/lang/String;)Landroid/net/Uri;" ,
49- & [ url_string . into ( ) ] ,
61+ & [ JValue :: Object ( & url_string ) ] ,
5062 ) ?;
5163
5264 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 ( ) ?;
5568
5669 let intent = env. new_object (
57- intent_class,
70+ & intent_class,
5871 "(Ljava/lang/String;Landroid/net/Uri;)V" ,
59- & [ action_view, uri] ,
72+ & [ JValue :: Object ( & action_view) , uri. borrow ( ) ] ,
6073 ) ?;
6174
6275 Ok ( Inner {
@@ -85,10 +98,10 @@ impl<'env> Intent<'env> {
8598 let class_name = inner. env . new_string ( class_name) ?;
8699
87100 inner. env . call_method (
88- inner. object ,
101+ & inner. object ,
89102 "setClassName" ,
90103 "(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 ) ] ,
92105 ) ?;
93106
94107 Ok ( inner)
@@ -110,10 +123,10 @@ impl<'env> Intent<'env> {
110123 let value = inner. env . new_string ( value) ?;
111124
112125 inner. env . call_method (
113- inner. object ,
126+ & inner. object ,
114127 "putExtra" ,
115128 "(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;" ,
116- & [ key . into ( ) , value . into ( ) ] ,
129+ & [ JValue :: Object ( & key ) , JValue :: Object ( & value ) ] ,
117130 ) ?;
118131
119132 Ok ( inner)
@@ -136,18 +149,17 @@ impl<'env> Intent<'env> {
136149 pub fn into_chooser_with_title ( self , title : Option < impl AsRef < str > > ) -> Self {
137150 self . and_then ( |mut inner| {
138151 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) ?
141153 } else {
142- JObject :: null ( ) . into ( )
154+ JString :: default ( )
143155 } ;
144156
145157 let intent_class = inner. env . find_class ( "android/content/Intent" ) ?;
146158 let intent = inner. env . call_static_method (
147159 intent_class,
148160 "createChooser" ,
149161 "(Landroid/content/Intent;Ljava/lang/CharSequence;)Landroid/content/Intent;" ,
150- & [ inner. object . into ( ) , title_value] ,
162+ & [ JValue :: Object ( & inner. object ) , JValue :: Object ( & title_value) ] ,
151163 ) ?;
152164
153165 inner. object = intent. try_into ( ) ?;
@@ -169,10 +181,10 @@ impl<'env> Intent<'env> {
169181 let jstring = inner. env . new_string ( type_name) ?;
170182
171183 inner. env . call_method (
172- inner. object ,
184+ & inner. object ,
173185 "setType" ,
174186 "(Ljava/lang/String;)Landroid/content/Intent;" ,
175- & [ jstring . into ( ) ] ,
187+ & [ JValue :: Object ( & jstring ) ] ,
176188 ) ?;
177189
178190 Ok ( inner)
@@ -188,14 +200,17 @@ impl<'env> Intent<'env> {
188200 activity,
189201 "startActivity" ,
190202 "(Landroid/content/Intent;)V" ,
191- & [ inner. object . into ( ) ] ,
203+ & [ JValue :: Object ( & inner. object ) ] ,
192204 ) ?;
193205
194206 Ok ( ( ) )
195207 } )
196208 }
197209
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 {
199214 self . inner = self . inner . and_then ( f) ;
200215 self
201216 }
0 commit comments