@@ -82,9 +82,17 @@ pub mod android {
82
82
output. into_raw ( )
83
83
}
84
84
85
- unsafe fn jstring_to_string ( env : & JNIEnv , string : JString ) -> String {
86
- let c_str = CStr :: from_ptr ( env. get_string ( string) . expect ( "invalid string" ) . as_ptr ( ) ) ;
87
- String :: from ( c_str. to_str ( ) . unwrap ( ) )
85
+ unsafe fn jstring_to_string ( env : & JNIEnv , string : JString ) -> Option < String > {
86
+ match env. get_string ( string) {
87
+ Ok ( java_str) => {
88
+ let c_str = CStr :: from_ptr ( java_str. as_ptr ( ) ) ;
89
+ match c_str. to_str ( ) {
90
+ Ok ( str_slice) => Some ( String :: from ( str_slice) ) ,
91
+ Err ( _) => None ,
92
+ }
93
+ }
94
+ Err ( _) => None ,
95
+ }
88
96
}
89
97
90
98
unsafe fn string_to_jstring ( env : & JNIEnv , string : String ) -> jstring {
@@ -136,7 +144,7 @@ pub mod android {
136
144
pub unsafe extern "C" fn Java_net_activitywatch_android_RustInterface_initialize (
137
145
env : JNIEnv ,
138
146
_: JClass ,
139
- ) {
147
+ ) -> jstring {
140
148
if !INITIALIZED {
141
149
android_logger:: init_once (
142
150
Config :: default ( )
@@ -154,9 +162,8 @@ pub mod android {
154
162
}
155
163
INITIALIZED = true ;
156
164
157
- // Without this it might not work due to weird error probably arising from Rust optimizing away the JNIEnv:
158
- // JNI DETECTED ERROR IN APPLICATION: use of deleted weak global reference
159
- string_to_jstring ( & env, "test" . to_string ( ) ) ;
165
+ // Return a string as expected by Java
166
+ string_to_jstring ( & env, "initialized" . to_string ( ) )
160
167
}
161
168
162
169
#[ no_mangle]
@@ -165,9 +172,16 @@ pub mod android {
165
172
_: JClass ,
166
173
java_dir : JString ,
167
174
) {
168
- let path = & jstring_to_string ( & env, java_dir) ;
169
- debug ! ( "Setting android data dir as {}" , path) ;
170
- dirs:: set_android_data_dir ( path) ;
175
+ match jstring_to_string ( & env, java_dir) {
176
+ Some ( path) => {
177
+ debug ! ( "Setting android data dir as {}" , path) ;
178
+ dirs:: set_android_data_dir ( & path) ;
179
+ }
180
+ None => {
181
+ // Failed to convert string - do nothing and return
182
+ return ;
183
+ }
184
+ }
171
185
}
172
186
173
187
#[ no_mangle]
@@ -185,7 +199,10 @@ pub mod android {
185
199
_: JClass ,
186
200
java_bucket : JString ,
187
201
) -> jstring {
188
- let bucket = jstring_to_string ( & env, java_bucket) ;
202
+ let bucket = match jstring_to_string ( & env, java_bucket) {
203
+ Some ( s) => s,
204
+ None => return create_error_object ( & env, "Failed to parse bucket string" . to_string ( ) ) ,
205
+ } ;
189
206
let bucket_json: Bucket = match serde_json:: from_str ( & bucket) {
190
207
Ok ( json) => json,
191
208
Err ( err) => return create_error_object ( & env, err. to_string ( ) ) ,
@@ -207,8 +224,16 @@ pub mod android {
207
224
java_event : JString ,
208
225
java_pulsetime : jdouble ,
209
226
) -> jstring {
210
- let bucket_id = jstring_to_string ( & env, java_bucket_id) ;
211
- let event = jstring_to_string ( & env, java_event) ;
227
+ let bucket_id = match jstring_to_string ( & env, java_bucket_id) {
228
+ Some ( s) => s,
229
+ None => {
230
+ return create_error_object ( & env, "Failed to parse bucket_id string" . to_string ( ) )
231
+ }
232
+ } ;
233
+ let event = match jstring_to_string ( & env, java_event) {
234
+ Some ( s) => s,
235
+ None => return create_error_object ( & env, "Failed to parse event string" . to_string ( ) ) ,
236
+ } ;
212
237
let pulsetime = java_pulsetime as f64 ;
213
238
let event_json: Event = match serde_json:: from_str ( & event) {
214
239
Ok ( json) => json,
@@ -233,7 +258,12 @@ pub mod android {
233
258
java_bucket_id : JString ,
234
259
java_limit : jint ,
235
260
) -> jstring {
236
- let bucket_id = jstring_to_string ( & env, java_bucket_id) ;
261
+ let bucket_id = match jstring_to_string ( & env, java_bucket_id) {
262
+ Some ( s) => s,
263
+ None => {
264
+ return create_error_object ( & env, "Failed to parse bucket_id string" . to_string ( ) )
265
+ }
266
+ } ;
237
267
let limit = java_limit as u64 ;
238
268
match openDatastore ( ) . get_events ( & bucket_id, None , None , Some ( limit) ) {
239
269
Ok ( events) => string_to_jstring ( & env, json ! ( events) . to_string ( ) ) ,
0 commit comments