| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // +build java android |
| |
| package util |
| |
| import ( |
| "reflect" |
| "time" |
| ) |
| |
| // #include "jni_wrapper.h" |
| // |
| // jvalue jBoolValue(jboolean val) { |
| // jvalue ret = { .z = val }; |
| // return ret; |
| // } |
| // jvalue jByteValue(jbyte val) { |
| // jvalue ret = { .b = val }; |
| // return ret; |
| // } |
| // jvalue jCharValue(jchar val) { |
| // jvalue ret = { .c = val }; |
| // return ret; |
| // } |
| // jvalue jShortValue(jshort val) { |
| // jvalue ret = { .s = val }; |
| // return ret; |
| // } |
| // jvalue jIntValue(jint val) { |
| // jvalue ret = { .i = val }; |
| // return ret; |
| // } |
| // jvalue jLongValue(jlong val) { |
| // jvalue ret = { .j = val }; |
| // return ret; |
| // } |
| // jvalue jFloatValue(jfloat val) { |
| // jvalue ret = { .f = val }; |
| // return ret; |
| // } |
| // jvalue jDoubleValue(jdouble val) { |
| // jvalue ret = { .d = val }; |
| // return ret; |
| // } |
| // jvalue jObjectValue(jobject val) { |
| // jvalue ret = { .l = val }; |
| // return ret; |
| // } |
| import "C" |
| |
| var errJValue = C.jObjectValue(nil) |
| |
| // jValue converts a Go value into a Java value with the given sign. |
| func jValue(env Env, v interface{}, sign Sign) (C.jvalue, bool) { |
| switch sign { |
| case BoolSign: |
| return jBoolValue(v) |
| case ByteSign: |
| return jByteValue(v) |
| case CharSign: |
| return jCharValue(v) |
| case ShortSign: |
| return jShortValue(v) |
| case IntSign: |
| return jIntValue(v) |
| case LongSign: |
| return jLongValue(v) |
| case StringSign: |
| return jStringValue(env, v) |
| case DateTimeSign: |
| return jDateTimeValue(env, v) |
| case DurationSign: |
| return jDurationValue(env, v) |
| case VExceptionSign: |
| return jVExceptionValue(env, v) |
| case ArraySign(ByteSign): |
| return jByteArrayValue(env, v) |
| case ArraySign(StringSign): |
| return jStringArrayValue(env, v) |
| case ArraySign(ArraySign(ByteSign)): |
| return jByteArrayArrayValue(env, v) |
| default: |
| return jObjectValue(v) |
| } |
| } |
| |
| func jBoolValue(v interface{}) (C.jvalue, bool) { |
| val, ok := v.(bool) |
| if !ok { |
| return errJValue, false |
| } |
| jBool := C.jboolean(C.JNI_FALSE) |
| if val { |
| jBool = C.jboolean(C.JNI_TRUE) |
| } |
| return C.jBoolValue(jBool), true |
| } |
| |
| func jByteValue(v interface{}) (C.jvalue, bool) { |
| val, ok := intValue(v) |
| if !ok { |
| return errJValue, false |
| } |
| return C.jByteValue(C.jbyte(val)), true |
| } |
| |
| func jCharValue(v interface{}) (C.jvalue, bool) { |
| val, ok := intValue(v) |
| if !ok { |
| return errJValue, false |
| } |
| return C.jCharValue(C.jchar(val)), true |
| } |
| |
| func jShortValue(v interface{}) (C.jvalue, bool) { |
| val, ok := intValue(v) |
| if !ok { |
| return errJValue, false |
| } |
| return C.jShortValue(C.jshort(val)), true |
| } |
| |
| func jIntValue(v interface{}) (C.jvalue, bool) { |
| val, ok := intValue(v) |
| if !ok { |
| return errJValue, false |
| } |
| return C.jIntValue(C.jint(val)), true |
| } |
| |
| func jLongValue(v interface{}) (C.jvalue, bool) { |
| val, ok := intValue(v) |
| if !ok { |
| return errJValue, false |
| } |
| return C.jLongValue(C.jlong(val)), true |
| } |
| |
| func jStringValue(env Env, v interface{}) (C.jvalue, bool) { |
| str, ok := v.(string) |
| if !ok { |
| return errJValue, false |
| } |
| return jObjectValue(JString(env, str)) |
| } |
| |
| func jDateTimeValue(env Env, v interface{}) (C.jvalue, bool) { |
| t, ok := v.(time.Time) |
| if !ok { |
| return errJValue, false |
| } |
| jTime, err := JTime(env, t) |
| if err != nil { |
| return errJValue, false |
| } |
| return jObjectValue(jTime) |
| } |
| |
| func jDurationValue(env Env, v interface{}) (C.jvalue, bool) { |
| d, ok := v.(time.Duration) |
| if !ok { |
| return errJValue, false |
| } |
| jDuration, err := JDuration(env, d) |
| if err != nil { |
| return errJValue, false |
| } |
| return jObjectValue(jDuration) |
| } |
| |
| func jVExceptionValue(env Env, v interface{}) (C.jvalue, bool) { |
| if v == nil { |
| return C.jObjectValue(nil), true |
| } |
| err, ok := v.(error) |
| if !ok { |
| return errJValue, false |
| } |
| jVException, err := JVException(env, err) |
| if err != nil { |
| return errJValue, false |
| } |
| return jObjectValue(jVException) |
| } |
| |
| func jByteArrayValue(env Env, v interface{}) (C.jvalue, bool) { |
| arr, ok := v.([]byte) |
| if !ok { |
| return errJValue, false |
| } |
| jArr, err := JByteArray(env, arr) |
| if err != nil { |
| return errJValue, false |
| } |
| return jObjectValue(jArr) |
| } |
| |
| func jStringArrayValue(env Env, v interface{}) (C.jvalue, bool) { |
| arr, ok := v.([]string) |
| if !ok { |
| return errJValue, false |
| } |
| jArr, err := JStringArray(env, arr) |
| if err != nil { |
| return errJValue, false |
| } |
| return jObjectValue(jArr) |
| } |
| |
| func jByteArrayArrayValue(env Env, v interface{}) (C.jvalue, bool) { |
| arr, ok := v.([][]byte) |
| if !ok { |
| return errJValue, false |
| } |
| jArr, err := JByteArrayArray(env, arr) |
| if err != nil { |
| return errJValue, false |
| } |
| return jObjectValue(jArr) |
| } |
| |
| func jObjectValue(v interface{}) (C.jvalue, bool) { |
| rv := reflect.ValueOf(v) |
| if !rv.IsValid() { // nil value |
| return C.jObjectValue(nil), true |
| } |
| switch val := v.(type) { |
| case Object: |
| return C.jObjectValue(val.value()), true |
| case Class: |
| return C.jObjectValue(C.jobject(val.value())), true |
| default: |
| return errJValue, false |
| } |
| } |
| |
| func intValue(v interface{}) (int64, bool) { |
| switch val := v.(type) { |
| case int64: |
| return val, true |
| case int: |
| return int64(val), true |
| case int32: |
| return int64(val), true |
| case int16: |
| return int64(val), true |
| case int8: |
| return int64(val), true |
| case uint64: |
| return int64(val), true |
| case uint: |
| return int64(val), true |
| case uint32: |
| return int64(val), true |
| case uint16: |
| return int64(val), true |
| case uint8: |
| return int64(val), true |
| default: |
| return 0, false |
| } |
| } |