@@ -203,6 +203,20 @@ Java_go_Seq_readUTF16(JNIEnv *env, jobject obj) {
203
203
return (* env )-> NewString (env , (jchar * )mem_read (env , obj , 2 * size ), size );
204
204
}
205
205
206
+ JNIEXPORT jbyteArray JNICALL
207
+ Java_go_Seq_readByteArray (JNIEnv * env , jobject obj ) {
208
+ // Send the (array length, pointer) pair encoded as two int64.
209
+ // The pointer value is omitted if array length is 0.
210
+ jlong size = Java_go_Seq_readInt64 (env , obj );
211
+ if (size == 0 ) {
212
+ return NULL ;
213
+ }
214
+ jbyteArray res = (* env )-> NewByteArray (env , size );
215
+ jlong ptr = Java_go_Seq_readInt64 (env , obj );
216
+ (* env )-> SetByteArrayRegion (env , res , 0 , size , (jbyte * )(intptr_t )(ptr ));
217
+ return res ;
218
+ }
219
+
206
220
#define MEM_WRITE (ty ) (*(ty*)mem_write(env, obj, sizeof(ty)))
207
221
208
222
JNIEXPORT void JNICALL
@@ -246,6 +260,35 @@ Java_go_Seq_writeUTF16(JNIEnv *env, jobject obj, jstring v) {
246
260
(* env )-> GetStringRegion (env , v , 0 , size , (jchar * )mem_write (env , obj , 2 * size ));
247
261
}
248
262
263
+ JNIEXPORT void JNICALL
264
+ Java_go_Seq_writeByteArray (JNIEnv * env , jobject obj , jbyteArray v ) {
265
+ // For Byte array, we pass only the (array length, pointer) pair
266
+ // encoded as two int64 values. If the array length is 0,
267
+ // the pointer value is omitted.
268
+ if (v == NULL ) {
269
+ MEM_WRITE (int64_t ) = 0 ;
270
+ return ;
271
+ }
272
+
273
+ jsize len = (* env )-> GetArrayLength (env , v );
274
+ MEM_WRITE (int64_t ) = len ;
275
+ if (len == 0 ) {
276
+ return ;
277
+ }
278
+
279
+ jboolean isCopy ;
280
+ jbyte * b = (* env )-> GetByteArrayElements (env , v , & isCopy );
281
+ if (isCopy ) {
282
+ // TODO: It's not clear how to handle if b is pointing to
283
+ // a copy that may become invalid with ReleaseByteArrayElements.
284
+ // Should we fall back to copy the byte array into the buffer?
285
+ LOG_FATAL ("got a copied byte array (len=%d)" , len );
286
+ }
287
+ // gross pointer-to-int64 conversion.
288
+ MEM_WRITE (int64_t ) = (int64_t )((intptr_t )b );
289
+ (* env )-> ReleaseByteArrayElements (env , v , (jbyte * )b , 0 );
290
+ }
291
+
249
292
JNIEXPORT void JNICALL
250
293
Java_go_Seq_resetOffset (JNIEnv * env , jobject obj ) {
251
294
mem * m = mem_get (env , obj );
0 commit comments