@@ -13,9 +13,9 @@ struct DecoderWrapper {
13
13
}
14
14
15
15
#[ no_mangle]
16
- pub extern "C" fn Java_de_maxhenkel_lame4j_Mp3Decoder_createDecoder ( env : JNIEnv < ' static > , _class : JClass ) -> jlong {
16
+ pub extern "C" fn Java_de_maxhenkel_lame4j_Mp3Decoder_createDecoder ( _env : JNIEnv , _class : JClass ) -> jlong {
17
17
let stream_wrapper = JavaInputStream {
18
- env,
18
+ env : None ,
19
19
input_stream : None ,
20
20
} ;
21
21
@@ -41,8 +41,18 @@ pub extern "C" fn Java_de_maxhenkel_lame4j_Mp3Decoder_decodeNextFrame<'a>(mut en
41
41
} ;
42
42
43
43
decoder_wrapper. decoder . reader_mut ( ) . input_stream = Some ( stream) ;
44
+ decoder_wrapper. decoder . reader_mut ( ) . env = Some ( env) ;
44
45
45
- let frame = match decoder_wrapper. decoder . next_frame ( ) {
46
+ let decode_result = decoder_wrapper. decoder . next_frame ( ) ;
47
+
48
+ let mut env = match decoder_wrapper. decoder . reader_mut ( ) . env . take ( ) {
49
+ Some ( env) => env,
50
+ None => {
51
+ panic ! ( "Cannot get Java environment" ) ;
52
+ }
53
+ } ;
54
+
55
+ let frame = match decode_result {
46
56
Ok ( frame) => frame,
47
57
Err ( Error :: Eof ) => {
48
58
return JShortArray :: from ( JObject :: null ( ) ) ;
@@ -131,7 +141,7 @@ pub extern "C" fn Java_de_maxhenkel_lame4j_Mp3Decoder_destroyDecoder(mut env: JN
131
141
}
132
142
133
143
struct JavaInputStream {
134
- env : JNIEnv < ' static > ,
144
+ env : Option < JNIEnv < ' static > > ,
135
145
input_stream : Option < JObject < ' static > > ,
136
146
}
137
147
@@ -141,9 +151,17 @@ impl Read for JavaInputStream {
141
151
return Ok ( 0 ) ;
142
152
}
143
153
144
- let byte_array = match self . env . new_byte_array ( buf. len ( ) as i32 ) {
154
+ let mut env = match self . env . take ( ) {
155
+ Some ( env) => env,
156
+ None => {
157
+ return Err ( std:: io:: Error :: new ( ErrorKind :: Other , "Environment unavailable" ) ) ;
158
+ }
159
+ } ;
160
+
161
+ let byte_array = match env. new_byte_array ( buf. len ( ) as i32 ) {
145
162
Ok ( byte_array) => byte_array,
146
163
Err ( e) => {
164
+ self . env = Some ( env) ;
147
165
return Err ( std:: io:: Error :: new ( ErrorKind :: Other , e) ) ;
148
166
}
149
167
} ;
@@ -154,36 +172,43 @@ impl Read for JavaInputStream {
154
172
let input_stream = match & self . input_stream {
155
173
Some ( input_stream) => input_stream,
156
174
None => {
175
+ self . env = Some ( env) ;
157
176
return Err ( std:: io:: Error :: new ( ErrorKind :: Other , "Input stream unavailable" ) ) ;
158
177
}
159
178
} ;
160
179
161
- let value = match self . env . call_method ( input_stream, "read" , "([B)I" , & [ jvalue] ) {
180
+ let value = match env. call_method ( input_stream, "read" , "([B)I" , & [ jvalue] ) {
162
181
Ok ( value) => value,
163
182
Err ( e) => {
183
+ self . env = Some ( env) ;
164
184
return Err ( std:: io:: Error :: new ( ErrorKind :: Other , e) ) ;
165
185
}
166
186
} ;
167
187
let num_bytes_read = match value. i ( ) {
168
188
Ok ( num_bytes_read) => num_bytes_read,
169
189
Err ( e) => {
190
+ self . env = Some ( env) ;
170
191
return Err ( std:: io:: Error :: new ( ErrorKind :: Other , e) ) ;
171
192
}
172
193
} ;
173
194
174
195
if num_bytes_read <= 0 {
196
+ self . env = Some ( env) ;
175
197
return Ok ( 0 ) ;
176
198
}
177
199
178
- let vec = match self . env . convert_byte_array ( byte_array) {
200
+ let vec = match env. convert_byte_array ( byte_array) {
179
201
Ok ( vec) => vec,
180
202
Err ( e) => {
203
+ self . env = Some ( env) ;
181
204
return Err ( std:: io:: Error :: new ( ErrorKind :: Other , e) ) ;
182
205
}
183
206
} ;
184
207
185
208
buf[ ..num_bytes_read as usize ] . copy_from_slice ( & vec[ ..num_bytes_read as usize ] ) ;
186
209
210
+ self . env = Some ( env) ;
211
+
187
212
return Ok ( num_bytes_read as usize ) ;
188
213
}
189
214
}
0 commit comments