java: Add and implement the JNI for Service.Login

MultiPart: 2/2
Change-Id: I6336d75198dc6ddef2de2764f2ee9cbabe3f0e9e
diff --git a/syncbase/src/main/java/io/v/syncbase/internal/Service.java b/syncbase/src/main/java/io/v/syncbase/internal/Service.java
index b898d0d..3ad493a 100644
--- a/syncbase/src/main/java/io/v/syncbase/internal/Service.java
+++ b/syncbase/src/main/java/io/v/syncbase/internal/Service.java
@@ -11,4 +11,5 @@
     public static native void SetPermissions(VersionedPermissions permissions) throws VError;
 
     public static native List<Id> ListDatabases() throws Error;
+    public static native void Login(String oAuthProvider, String oAuthToken) throws VError;
 }
\ No newline at end of file
diff --git a/syncbase/src/test/java/io/v/syncbase/internal/ServiceTest.java b/syncbase/src/test/java/io/v/syncbase/internal/ServiceTest.java
index da6b8d9..b02c423 100644
--- a/syncbase/src/test/java/io/v/syncbase/internal/ServiceTest.java
+++ b/syncbase/src/test/java/io/v/syncbase/internal/ServiceTest.java
@@ -41,4 +41,20 @@
             fail(vError.toString());
         }
     }
+
+    @Test
+    public void login() {
+        boolean exceptionThrown = false;
+        try {
+            Service.Login("dummy-provider", "");
+        } catch (VError vError) {
+            assertEquals("v.io/v23/verror.Unknown", vError.id);
+            assertNotNull(vError.message);
+            assertTrue(vError.message.contains("dummy-provider"));
+            assertNotNull(vError.stack);
+            assertEquals(0, vError.actionCode);
+            exceptionThrown = true;
+        }
+        assertTrue(exceptionThrown);
+    }
 }