// GoByteArray converts the provided Java byte array into a Go byte slice. func GoByteArray(env Env, arr Object) (ret []byte) { if arr.IsNull() { return nil } length := int(C.GetArrayLength(env.value(), C.jarray(arr.value()))) ret = make([]byte, length) bytes := C.GetByteArrayElements(env.value(), C.jbyteArray(arr.value()), nil) defer C.ReleaseByteArrayElements(env.value(), C.jbyteArray(arr.value()), bytes, C.JNI_ABORT) ptr := bytes for i := 0; i < length; i++ { ret[i] = byte(*ptr) ptr = (*C.jbyte)(unsafe.Pointer(uintptr(unsafe.Pointer(ptr)) + unsafe.Sizeof(*ptr))) } return }
// GoLongArray converts the provided Java long array into a Go int64 slice. func GoLongArray(env Env, arr Object) (ret []int64) { if arr.IsNull() { return } length := int(C.GetArrayLength(env.value(), C.jarray(arr.value()))) ret = make([]int64, length) elems := C.GetLongArrayElements(env.value(), C.jlongArray(arr.value()), nil) defer C.ReleaseLongArrayElements(env.value(), C.jlongArray(arr.value()), elems, C.JNI_ABORT) ptr := elems for i := 0; i < length; i++ { ret[i] = int64(*ptr) ptr = (*C.jlong)(unsafe.Pointer(uintptr(unsafe.Pointer(ptr)) + unsafe.Sizeof(*ptr))) } return }
// GoObjectArray converts a Java object array to a Go slice of Java objects. func GoObjectArray(env Env, arr Object) ([]Object, error) { if arr.IsNull() { return nil, nil } length := int(C.GetArrayLength(env.value(), C.jarray(arr.value()))) ret := make([]Object, length) for i := 0; i < length; i++ { ret[i] = Object(uintptr(unsafe.Pointer(C.GetObjectArrayElement(env.value(), C.jobjectArray(arr.value()), C.jsize(i))))) if err := JExceptionMsg(env); err != nil { // Out-of-bounds index. return nil, err } } return ret, nil }