blob: f06fc810b89b3207aa5d008963c1342a9586ec97 [file] [log] [blame]
// Copyright 2016 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
// +build cgo
package main
// #include <stdlib.h>
// #include "jni_wrapper.h"
// #include "lib.h"
import "C"
type jArrayListClass struct {
class C.jclass
init C.jmethodID
add C.jmethodID
}
func newJArrayListClass(env *C.JNIEnv) jArrayListClass {
cls, init := initClass(env, "java/util/ArrayList")
return jArrayListClass{
class: cls,
init: init,
add: jGetMethodID(env, cls, "add", "(Ljava/lang/Object;)Z"),
}
}
type jIteratorInterface struct {
hasNext C.jmethodID
next C.jmethodID
}
func newJIteratorInterface(env *C.JNIEnv, obj C.jobject) jIteratorInterface {
cls := C.GetObjectClass(env, obj)
return jIteratorInterface{
hasNext: jGetMethodID(env, cls, "hasNext", "()Z"),
next: jGetMethodID(env, cls, "next", "()Ljava/lang/Object;"),
}
}
type jIdClass struct {
class C.jclass
init C.jmethodID
blessing C.jfieldID
name C.jfieldID
}
func newJIdClass(env *C.JNIEnv) jIdClass {
cls, init := initClass(env, "io/v/syncbase/internal/Id")
return jIdClass{
class: cls,
init: init,
blessing: jGetFieldID(env, cls, "blessing", "Ljava/lang/String;"),
name: jGetFieldID(env, cls, "name", "Ljava/lang/String;"),
}
}
type jListInterface struct {
iterator C.jmethodID
size C.jmethodID
}
func newJListInterface(env *C.JNIEnv, obj C.jobject) jListInterface {
cls := C.GetObjectClass(env, obj)
return jListInterface{
size: jGetMethodID(env, cls, "size", "()I"),
iterator: jGetMethodID(env, cls, "iterator", "()Ljava/util/Iterator;"),
}
}
type jSyncgroupMemberInfo struct {
class C.jclass
init C.jmethodID
syncPriority C.jfieldID
blobDevType C.jfieldID
}
func newJSyncgroupMemberInfo(env *C.JNIEnv) jSyncgroupMemberInfo {
cls, init := initClass(env, "io/v/syncbase/internal/Database$SyncgroupMemberInfo")
return jSyncgroupMemberInfo{
class: cls,
init: init,
syncPriority: jGetFieldID(env, cls, "syncPriority", "I"),
blobDevType: jGetFieldID(env, cls, "blobDevType", "I"),
}
}
type jSyncgroupSpec struct {
class C.jclass
init C.jmethodID
description C.jfieldID
publishSyncbaseName C.jfieldID
permissions C.jfieldID
collections C.jfieldID
mountTables C.jfieldID
isPrivate C.jfieldID
}
func newJSyncgroupSpec(env *C.JNIEnv) jSyncgroupSpec {
cls, init := initClass(env, "io/v/syncbase/internal/Database$SyncgroupSpec")
return jSyncgroupSpec{
class: cls,
init: init,
description: jGetFieldID(env, cls, "description", "Ljava/lang/String;"),
publishSyncbaseName: jGetFieldID(env, cls, "publishSyncbaseName", "Ljava/lang/String;"),
permissions: jGetFieldID(env, cls, "permissions", "Lio/v/syncbase/internal/Permissions;"),
collections: jGetFieldID(env, cls, "collections", "Ljava/util/List;"),
mountTables: jGetFieldID(env, cls, "mountTables", "Ljava/util/List;"),
isPrivate: jGetFieldID(env, cls, "isPrivate", "Z"),
}
}
type jVErrorClass struct {
class C.jclass
init C.jmethodID
id C.jfieldID
actionCode C.jfieldID
message C.jfieldID
stack C.jfieldID
}
func newJVErrorClass(env *C.JNIEnv) jVErrorClass {
cls, init := initClass(env, "io/v/syncbase/internal/VError")
return jVErrorClass{
class: cls,
init: init,
id: jGetFieldID(env, cls, "id", "Ljava/lang/String;"),
actionCode: jGetFieldID(env, cls, "actionCode", "J"),
message: jGetFieldID(env, cls, "message", "Ljava/lang/String;"),
stack: jGetFieldID(env, cls, "stack", "Ljava/lang/String;"),
}
}
// initClass returns the jclass and the jmethodID of the default constructor for
// a class.
func initClass(env *C.JNIEnv, name string) (C.jclass, C.jmethodID) {
cls, err := jFindClass(env, name)
if err != nil {
// The invariant is that we only deal with classes that must be
// known to the JVM. A panic indicates a bug in our code.
panic(err)
}
init := jGetMethodID(env, cls, "<init>", "()V")
return cls, init
}