diff --git a/gojni.h b/gojni.h index 008dfd6..9a1e065 100644 --- a/gojni.h +++ b/gojni.h @@ -23,6 +23,7 @@ __attribute__ ((visibility ("hidden"))) void _jni_DeleteGlobalRef(JNIEnv *env, j __attribute__ ((visibility ("hidden"))) jobject _jni_NewLocalRef(JNIEnv *env, jobject obj); __attribute__ ((visibility ("hidden"))) void _jni_DeleteLocalRef(JNIEnv *env, jobject obj); __attribute__ ((visibility ("hidden"))) jint _jni_CallStaticIntMethodA(JNIEnv *env, jclass cls, jmethodID method, jvalue *args); +__attribute__ ((visibility ("hidden"))) jboolean _jni_CallStaticBooleanMethodA(JNIEnv *env, jclass cls, jmethodID method, jvalue *args); __attribute__ ((visibility ("hidden"))) jobject _jni_CallStaticObjectMethodA(JNIEnv *env, jclass cls, jmethodID method, jvalue *args); __attribute__ ((visibility ("hidden"))) jobject _jni_NewObjectA(JNIEnv *env, jclass cls, jmethodID method, jvalue *args); __attribute__ ((visibility ("hidden"))) void _jni_CallStaticVoidMethodA(JNIEnv *env, jclass cls, jmethodID method, jvalue *args); diff --git a/jni.c b/jni.c index 2aae752..e66bd9f 100644 --- a/jni.c +++ b/jni.c @@ -118,6 +118,10 @@ jint _jni_CallStaticIntMethodA(JNIEnv *env, jclass cls, jmethodID method, jvalue return (*env)->CallStaticIntMethodA(env, cls, method, args); } +jboolean _jni_CallStaticBooleanMethodA(JNIEnv *env, jclass cls, jmethodID method, jvalue *args) { + return (*env)->CallStaticBooleanMethodA(env, cls, method, args); +} + jobject _jni_CallStaticObjectMethodA(JNIEnv *env, jclass cls, jmethodID method, jvalue *args) { return (*env)->CallStaticObjectMethodA(env, cls, method, args); } diff --git a/jni.go b/jni.go index 22ec8f4..6035453 100644 --- a/jni.go +++ b/jni.go @@ -104,6 +104,12 @@ func CallStaticIntMethod(e Env, cls Class, method MethodID, args ...Value) (int, return int(res), exception(e) } +// CallStaticBooleanMethod calls a static method on a Java class, returning an int. +func CallStaticBooleanMethod(e Env, cls Class, method MethodID, args ...Value) (bool, error) { + res := C._jni_CallStaticBooleanMethodA(e.env, C.jclass(cls), C.jmethodID(method), varArgs(args)) + return res == TRUE, exception(e) +} + // FindClass returns a reference to a Java class with a given name, using the // JVM's default class loader. Any exceptions caused by the underlying JNI call // (for example if the class is not found) will result in a panic. diff --git a/jni_test.go b/jni_test.go index f5c6c00..4d1dcb0 100644 --- a/jni_test.go +++ b/jni_test.go @@ -198,6 +198,44 @@ func TestStaticObjectMethod(t *testing.T) { } } +func TestStaticBooleanMethod(t *testing.T) { + err := Do(vm, func(env Env) error { + cls := FindClass(env, "test/AClass") + mid := GetStaticMethodID(env, cls, "GetStaticBoolean", "()Z") + if mid == nil { + t.Errorf("MethodID is nil") + } + setterMid := GetStaticMethodID(env, cls, "SetStaticBoolean", "(Z)V") + if setterMid == nil { + t.Errorf("Setter MethodID is nil") + } + res, err := CallStaticBooleanMethod(env, cls, mid) + if err != nil { + t.Errorf("Method invocation failed") + } + if !res { + t.Errorf("Method returned %v, not expected value of %v.", res, true) + } + if err := CallStaticVoidMethod(env, cls, setterMid, FALSE); err != nil { + t.Errorf("Setter invocation failed") + } + res, err = CallStaticBooleanMethod(env, cls, mid) + if err != nil { + t.Errorf("Method invocation failed") + } + if res { + t.Errorf("Method returned %v, not expected value of %v.", res, false) + } + if err := CallStaticVoidMethod(env, cls, setterMid, TRUE); err != nil { + t.Errorf("Setter invocation failed") + } + return err + }) + if err != nil { + t.Errorf("Error: %s", err) + } +} + func TestMethod(t *testing.T) { defer func() { if r := recover(); r == nil { diff --git a/test/AClass.class b/test/AClass.class index 45d3b33..60ccca6 100644 Binary files a/test/AClass.class and b/test/AClass.class differ diff --git a/test/AClass.java b/test/AClass.java index fd8002d..f94a126 100644 --- a/test/AClass.java +++ b/test/AClass.java @@ -47,7 +47,7 @@ public class AClass { private float pfl = (float)2.2; private double pdb = 1001.1001; - public static Boolean GetStaticBoolean() { + public static boolean GetStaticBoolean() { return staticbl; } @@ -75,6 +75,10 @@ public class AClass { return staticobj; } + public static void SetStaticBoolean(boolean val) { + staticbl = val; + } + public void IncInt() { in = in + 1; }