@@ -10,7 +10,7 @@ use jni::objects::{GlobalRef, JClass, JObject, JString, JValue};
1010use jni:: sys:: { jint, jobject, jstring} ;
1111use log:: info;
1212
13- use crate :: { blocking_google_ch } ;
13+ use crate :: { tls_get } ;
1414
1515
1616#[ no_mangle]
@@ -34,167 +34,17 @@ pub unsafe extern "system" fn Java_com_schuetz_rustandroidios_JniApi_initLogger(
3434}
3535
3636#[ no_mangle]
37- pub unsafe extern "system" fn Java_com_schuetz_rustandroidios_JniApi_getGoogle (
37+ pub unsafe extern "system" fn Java_com_schuetz_rustandroidios_JniApi_TLS_get (
3838 env : JNIEnv ,
3939 _: JClass ,
4040 cache_dir_j : JString ,
41+ domain_j : JString ,
4142) -> jstring {
4243 let cache_dir: String = env. get_string ( cache_dir_j) . expect ( "Couldn't create rust string" ) . into ( ) ;
43- let output = match blocking_google_ch ( & cache_dir[ ..] ) {
44- Ok ( s) => format ! ( "Google.ch says: {}" , s) ,
45- Err ( e) => format ! ( "Error while calling google: {}" , e) ,
44+ let domain: String = env. get_string ( domain_j) . expect ( "Couldn't create rust string" ) . into ( ) ;
45+ let output = match tls_get ( & domain, Some ( & cache_dir) ) {
46+ Ok ( s) => format ! ( "Result is: {}" , s) ,
47+ Err ( e) => format ! ( "Error while getting result: {}" , e) ,
4648 } ;
4749 env. new_string ( output) . expect ( "Failed to build java string" ) . into_inner ( )
4850}
49-
50- #[ no_mangle]
51- pub unsafe extern "system" fn Java_com_schuetz_rustandroidios_JniApi_greet (
52- env : JNIEnv ,
53- _: JClass ,
54- who : JString ,
55- ) -> jstring {
56- let str: String = env. get_string ( who)
57- . expect ( "Couldn't create rust string" ) . into ( ) ;
58-
59- let output = env. new_string ( format ! ( "Hello 👋 {}!" , str ) )
60- . expect ( "Couldn't create java string" ) ;
61-
62- output. into_inner ( )
63- }
64-
65- #[ no_mangle]
66- pub unsafe extern "system" fn Java_com_schuetz_rustandroidios_JniApi_add (
67- _env : JNIEnv ,
68- _: JClass ,
69- value1 : jint ,
70- value2 : jint ,
71- ) -> jint {
72- info ! ( "Passed value1: {}, value2: {}" , value1, value2) ;
73- value1 + value2
74- }
75-
76- #[ no_mangle]
77- pub unsafe extern "system" fn Java_com_schuetz_rustandroidios_JniApi_passObject (
78- env : JNIEnv ,
79- _: JClass ,
80- object : JObject ,
81- ) {
82- let my_int_j_value_res = env. get_field ( object, "intPar" , "I" ) ;
83- let my_int: i32 = my_int_j_value_res. unwrap ( ) . i ( ) . unwrap ( ) ;
84-
85- let my_str_j_value = env. get_field ( object, "stringPar" , "Ljava/lang/String;" )
86- . expect ( "Couldn't get JValue" ) ;
87- let my_str_j_object = my_str_j_value. l ( ) ;
88- let my_str_j_string = JString :: from ( my_str_j_object. unwrap ( ) ) ;
89-
90- let my_str_java_string = env. get_string ( my_str_j_string) . unwrap ( ) ;
91- let my_str = my_str_java_string. to_str ( ) . unwrap ( ) ;
92-
93- info ! ( "Passed: {}, {}" , my_int, my_str) ;
94- }
95-
96- #[ no_mangle]
97- pub unsafe extern "system" fn Java_com_schuetz_rustandroidios_JniApi_returnObject (
98- env : JNIEnv ,
99- _: JClass ,
100- ) -> jobject {
101- let cls = env. find_class ( "com/schuetz/rustandroidios/Dummy" ) ;
102-
103- let my_int_j_value = JValue :: from ( 123 ) ;
104-
105- let str_parameter_j_string = env. new_string ( "my string parameter" )
106- . expect ( "Couldn't create java string!" ) ;
107- let str_parameter_j_value = JValue :: from ( JObject :: from ( str_parameter_j_string) ) ;
108-
109- let obj = env. new_object (
110- cls. unwrap ( ) ,
111- "(Ljava/lang/String;I)V" ,
112- & [ str_parameter_j_value, my_int_j_value] ,
113- ) ;
114-
115- obj. unwrap ( ) . into_inner ( )
116- }
117-
118- pub static mut CALLBACK_SENDER : Option < Sender < String > > = None ;
119-
120- #[ no_mangle]
121- pub unsafe extern "system" fn Java_com_schuetz_rustandroidios_JniApi_registerCallback (
122- env : JNIEnv ,
123- _: JClass ,
124- callback : jobject ,
125- ) {
126- let my_callback = MyCallbackImpl {
127- java_vm : env. get_java_vm ( ) . unwrap ( ) ,
128- callback : env. new_global_ref ( callback) . unwrap ( ) ,
129- } ;
130- register_callback_internal ( Box :: new ( my_callback) ) ;
131-
132- // Let's send a message immediately, to test it
133- send_to_callback ( "Hello callback!" . to_owned ( ) ) ;
134- }
135-
136- unsafe fn send_to_callback ( string : String ) {
137- match & CALLBACK_SENDER {
138- Some ( s) => {
139- s. send ( string) . expect ( "Couldn't send message to callback!" ) ;
140- }
141- None => {
142- info ! ( "No callback registered" ) ;
143- }
144- }
145- }
146-
147- fn register_callback_internal ( callback : Box < dyn MyCallback > ) {
148- // Make callback implement Send (marker for thread safe, basically) https://doc.rust-lang.org/std/marker/trait.Send.html
149- let my_callback =
150- unsafe { std:: mem:: transmute :: < Box < dyn MyCallback > , Box < dyn MyCallback + Send > > ( callback) } ;
151-
152- // Create channel
153- let ( tx, rx) : ( Sender < String > , Receiver < String > ) = mpsc:: channel ( ) ;
154-
155- // Save the sender in a static variable, which will be used to push elements to the callback
156- unsafe {
157- CALLBACK_SENDER = Some ( tx) ;
158- }
159-
160- // Thread waits for elements pushed to SENDER and calls the callback
161- thread:: spawn ( move || {
162- for string in rx. iter ( ) {
163- my_callback. call ( string)
164- }
165- } ) ;
166- }
167-
168- trait MyCallback {
169- fn call ( & self , par : String ) ;
170- }
171-
172- struct MyCallbackImpl {
173- // The callback passed from Android is a local reference: only valid during the method call.
174- // To store it, we need to put it in a global reference.
175- // See https://developer.android.com/training/articles/perf-jni#local-and-global-references
176- callback : GlobalRef ,
177-
178- // We need JNIEnv to call the callback.
179- // JNIEnv is valid only in the same thread, so we have to store the vm instead, and use it to get
180- // a JNIEnv for the current thread.
181- // See https://developer.android.com/training/articles/perf-jni#javavm-and-jnienvb
182- java_vm : JavaVM ,
183- }
184-
185- impl MyCallback for MyCallbackImpl {
186- fn call ( & self , par : String ) {
187- let env = self . java_vm . attach_current_thread ( ) . unwrap ( ) ;
188-
189- let str = env. new_string ( par)
190- . expect ( "Couldn't create java string!" ) ;
191- let str_j_value = JValue :: from ( JObject :: from ( str) ) ;
192-
193- env. call_method (
194- self . callback . as_obj ( ) ,
195- "call" ,
196- "(Ljava/lang/String;)V" ,
197- & [ str_j_value] ,
198- ) . expect ( "Couldn't call callback" ) ;
199- }
200- }
0 commit comments