Merge branch 'master' into ble
diff --git a/impl/google/discovery/jni.go b/impl/google/discovery/jni.go
new file mode 100644
index 0000000..354593a
--- /dev/null
+++ b/impl/google/discovery/jni.go
@@ -0,0 +1,67 @@
+// 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 discovery
+
+import (
+ "bytes"
+ "encoding/binary"
+ "unsafe"
+
+ jutil "v.io/x/jni/util"
+ "v.io/x/ref/lib/discovery"
+)
+
+// #include "jni.h"
+// #include <stdlib.h>
+import "C"
+
+var (
+ classSign = jutil.ClassSign("java.lang.Class")
+ // Global reference for java.util.UUID class;
+ jUUIDClass jutil.Class
+)
+
+// Init initializes the JNI code with the given Java environment. This method
+// must be called from the main Java thread.
+func Init(env jutil.Env) error {
+ // Cache global references to all Java classes used by the package. This is
+ // necessary because JNI gets access to the class loader only in the system
+ // thread, so we aren't able to invoke FindClass in other threads.
+ var err error
+ jUUIDClass, err = jutil.JFindClass(env, "java/util/UUID")
+
+ return err
+}
+
+func convertStringtoUUID(jenv *C.JNIEnv, _ C.jclass, jName C.jstring, generator func(string) discovery.Uuid) C.jobject {
+ env := jutil.Env(uintptr(unsafe.Pointer(jenv)))
+ name := jutil.GoString(env, jutil.Object(uintptr(unsafe.Pointer(jName))))
+ uuid := generator(name)
+ buf := bytes.NewBuffer(uuid)
+ var high, low int64
+ binary.Read(buf, binary.BigEndian, &high)
+ binary.Read(buf, binary.BigEndian, &low)
+ jUUID, err := jutil.NewObject(env, jUUIDClass, []jutil.Sign{jutil.LongSign, jutil.LongSign}, high, low)
+ if err != nil {
+ jutil.JThrowV(env, err)
+ return nil
+ }
+ return C.jobject(unsafe.Pointer(jUUID))
+}
+
+//export Java_io_v_impl_google_lib_discovery_UUIDUtil_UUIDForInterfaceName
+func Java_io_v_impl_google_lib_discovery_UUIDUtil_UUIDForInterfaceName(jenv *C.JNIEnv, jclass C.jclass, jName C.jstring) C.jobject {
+ return convertStringtoUUID(jenv, jclass, jName, discovery.NewServiceUUID)
+}
+
+//export Java_io_v_impl_google_lib_discovery_UUIDUtil_UUIDForAttributeKey
+func Java_io_v_impl_google_lib_discovery_UUIDUtil_UUIDForAttributeKey(jenv *C.JNIEnv, jclass C.jclass, jName C.jstring) C.jobject {
+ converter := func(s string) discovery.Uuid {
+ return discovery.Uuid(discovery.NewAttributeUUID(s))
+ }
+ return convertStringtoUUID(jenv, jclass, jName, converter)
+}
diff --git a/impl/google/jni.go b/impl/google/jni.go
index 217ce8b..bda3428 100644
--- a/impl/google/jni.go
+++ b/impl/google/jni.go
@@ -13,6 +13,7 @@
jrt "v.io/x/jni/impl/google/rt"
jservices "v.io/x/jni/impl/google/services"
jutil "v.io/x/jni/util"
+ jdiscovery "v.io/x/jni/impl/google/discovery"
)
// #include "jni.h"
@@ -37,5 +38,9 @@
if err := jservices.Init(env); err != nil {
return err
}
+
+ if err := jdiscovery.Init(env); err != nil {
+ return err
+ }
return nil
}