@@ -82,9 +82,10 @@ 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
+ let java_str = env. get_string ( string) . ok ( ) ?;
87
+ let c_str = CStr :: from_ptr ( java_str. as_ptr ( ) ) ;
88
+ c_str. to_str ( ) . ok ( ) . map ( String :: from)
88
89
}
89
90
90
91
unsafe fn string_to_jstring ( env : & JNIEnv , string : String ) -> jstring {
@@ -136,7 +137,7 @@ pub mod android {
136
137
pub unsafe extern "C" fn Java_net_activitywatch_android_RustInterface_initialize (
137
138
env : JNIEnv ,
138
139
_: JClass ,
139
- ) {
140
+ ) -> jstring {
140
141
if !INITIALIZED {
141
142
android_logger:: init_once (
142
143
Config :: default ( )
@@ -154,9 +155,8 @@ pub mod android {
154
155
}
155
156
INITIALIZED = true ;
156
157
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 ( ) ) ;
158
+ // Return a string as expected by Java
159
+ string_to_jstring ( & env, "initialized" . to_string ( ) )
160
160
}
161
161
162
162
#[ no_mangle]
@@ -165,9 +165,16 @@ pub mod android {
165
165
_: JClass ,
166
166
java_dir : JString ,
167
167
) {
168
- let path = & jstring_to_string ( & env, java_dir) ;
169
- debug ! ( "Setting android data dir as {}" , path) ;
170
- dirs:: set_android_data_dir ( path) ;
168
+ match jstring_to_string ( & env, java_dir) {
169
+ Some ( path) => {
170
+ debug ! ( "Setting android data dir as {}" , path) ;
171
+ dirs:: set_android_data_dir ( & path) ;
172
+ }
173
+ None => {
174
+ // Failed to convert string - do nothing and return
175
+ return ;
176
+ }
177
+ }
171
178
}
172
179
173
180
#[ no_mangle]
@@ -185,7 +192,10 @@ pub mod android {
185
192
_: JClass ,
186
193
java_bucket : JString ,
187
194
) -> jstring {
188
- let bucket = jstring_to_string ( & env, java_bucket) ;
195
+ let bucket = match jstring_to_string ( & env, java_bucket) {
196
+ Some ( s) => s,
197
+ None => return create_error_object ( & env, "Failed to parse bucket string" . to_string ( ) ) ,
198
+ } ;
189
199
let bucket_json: Bucket = match serde_json:: from_str ( & bucket) {
190
200
Ok ( json) => json,
191
201
Err ( err) => return create_error_object ( & env, err. to_string ( ) ) ,
@@ -207,8 +217,16 @@ pub mod android {
207
217
java_event : JString ,
208
218
java_pulsetime : jdouble ,
209
219
) -> jstring {
210
- let bucket_id = jstring_to_string ( & env, java_bucket_id) ;
211
- let event = jstring_to_string ( & env, java_event) ;
220
+ let bucket_id = match jstring_to_string ( & env, java_bucket_id) {
221
+ Some ( s) => s,
222
+ None => {
223
+ return create_error_object ( & env, "Failed to parse bucket_id string" . to_string ( ) )
224
+ }
225
+ } ;
226
+ let event = match jstring_to_string ( & env, java_event) {
227
+ Some ( s) => s,
228
+ None => return create_error_object ( & env, "Failed to parse event string" . to_string ( ) ) ,
229
+ } ;
212
230
let pulsetime = java_pulsetime as f64 ;
213
231
let event_json: Event = match serde_json:: from_str ( & event) {
214
232
Ok ( json) => json,
@@ -233,7 +251,12 @@ pub mod android {
233
251
java_bucket_id : JString ,
234
252
java_limit : jint ,
235
253
) -> jstring {
236
- let bucket_id = jstring_to_string ( & env, java_bucket_id) ;
254
+ let bucket_id = match jstring_to_string ( & env, java_bucket_id) {
255
+ Some ( s) => s,
256
+ None => {
257
+ return create_error_object ( & env, "Failed to parse bucket_id string" . to_string ( ) )
258
+ }
259
+ } ;
237
260
let limit = java_limit as u64 ;
238
261
match openDatastore ( ) . get_events ( & bucket_id, None , None , Some ( limit) ) {
239
262
Ok ( events) => string_to_jstring ( & env, json ! ( events) . to_string ( ) ) ,
0 commit comments