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
 }