From b5d97bc020b962a33c5d7e5d75e43458ed7e75f1 Mon Sep 17 00:00:00 2001 From: Chris Waldon Date: Fri, 26 Jun 2020 15:26:00 -0400 Subject: [PATCH] feat: implement calling more non-static method types --- gojni.h | 7 +++++++ jni.c | 28 ++++++++++++++++++++++++++++ jni.go | 45 +++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 78 insertions(+), 2 deletions(-) diff --git a/gojni.h b/gojni.h index b4c0e78..2d0cb86 100644 --- a/gojni.h +++ b/gojni.h @@ -29,6 +29,13 @@ __attribute__ ((visibility ("hidden"))) void _jni_CallStaticVoidMethodA(JNIEnv * __attribute__ ((visibility ("hidden"))) jobject _jni_CallObjectMethodA(JNIEnv *env, jobject obj, jmethodID method, jvalue *args); __attribute__ ((visibility ("hidden"))) jint _jni_CallIntMethodA(JNIEnv *env, jobject obj, jmethodID method, jvalue *args); __attribute__ ((visibility ("hidden"))) void _jni_CallVoidMethodA(JNIEnv *env, jobject obj, jmethodID method, jvalue *args); +__attribute__ ((visibility ("hidden"))) jboolean _jni_CallBooleanMethodA(JNIEnv *env, jobject obj, jmethodID method, jvalue *args); +__attribute__ ((visibility ("hidden"))) jbyte _jni_CallByteMethodA(JNIEnv *env, jobject obj, jmethodID method, jvalue *args); +__attribute__ ((visibility ("hidden"))) jchar _jni_CallCharMethodA(JNIEnv *env, jobject obj, jmethodID method, jvalue *args); +__attribute__ ((visibility ("hidden"))) jshort _jni_CallShortMethodA(JNIEnv *env, jobject obj, jmethodID method, jvalue *args); +__attribute__ ((visibility ("hidden"))) jlong _jni_CallLongMethodA(JNIEnv *env, jobject obj, jmethodID method, jvalue *args); +__attribute__ ((visibility ("hidden"))) jfloat _jni_CallFloatMethodA(JNIEnv *env, jobject obj, jmethodID method, jvalue *args); +__attribute__ ((visibility ("hidden"))) jdouble _jni_CallDoubleMethodA(JNIEnv *env, jobject obj, jmethodID method, jvalue *args); __attribute__ ((visibility ("hidden"))) jbyteArray _jni_NewByteArray(JNIEnv *env, jsize length); __attribute__ ((visibility ("hidden"))) jbyte *_jni_GetByteArrayElements(JNIEnv *env, jbyteArray arr); __attribute__ ((visibility ("hidden"))) void _jni_ReleaseByteArrayElements(JNIEnv *env, jbyteArray arr, jbyte *elems, jint mode); diff --git a/jni.c b/jni.c index dea749d..ef7ee95 100644 --- a/jni.c +++ b/jni.c @@ -134,6 +134,34 @@ void _jni_CallVoidMethodA(JNIEnv *env, jobject obj, jmethodID method, jvalue *ar (*env)->CallVoidMethodA(env, obj, method, args); } +jboolean _jni_CallBooleanMethodA(JNIEnv *env, jobject obj, jmethodID method, jvalue *args) { + return (*env)->CallBooleanMethodA(env, obj, method, args); +} + +jbyte _jni_CallByteMethodA(JNIEnv *env, jobject obj, jmethodID method, jvalue *args) { + return (*env)->CallByteMethodA(env, obj, method, args); +} + +jchar _jni_CallCharMethodA(JNIEnv *env, jobject obj, jmethodID method, jvalue *args) { + return (*env)->CallCharMethodA(env, obj, method, args); +} + +jshort _jni_CallShortMethodA(JNIEnv *env, jobject obj, jmethodID method, jvalue *args) { + return (*env)->CallShortMethodA(env, obj, method, args); +} + +jlong _jni_CallLongMethodA(JNIEnv *env, jobject obj, jmethodID method, jvalue *args) { + return (*env)->CallLongMethodA(env, obj, method, args); +} + +jfloat _jni_CallFloatMethodA(JNIEnv *env, jobject obj, jmethodID method, jvalue *args) { + return (*env)->CallFloatMethodA(env, obj, method, args); +} + +jdouble _jni_CallDoubleMethodA(JNIEnv *env, jobject obj, jmethodID method, jvalue *args) { + return (*env)->CallDoubleMethodA(env, obj, method, args); +} + jbyteArray _jni_NewByteArray(JNIEnv *env, jsize length) { return (*env)->NewByteArray(env, length); } diff --git a/jni.go b/jni.go index 3134210..c900a30 100644 --- a/jni.go +++ b/jni.go @@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. - // Package jni implements various helper functions for communicating with the // Android JVM though JNI. package jni @@ -44,7 +43,7 @@ type ( ) const ( - TRUE = C.JNI_TRUE + TRUE = C.JNI_TRUE FALSE = C.JNI_FALSE ) @@ -155,6 +154,48 @@ func CallIntMethod(e Env, obj Object, method MethodID, args ...Value) (int32, er return int32(res), exception(e) } +// CallBooleanMethod calls a method on an object, returning a bool. +func CallBooleanMethod(e Env, obj Object, method MethodID, args ...Value) (bool, error) { + res := C._jni_CallBooleanMethodA(e.env, C.jobject(obj), C.jmethodID(method), varArgs(args)) + return res == TRUE, exception(e) +} + +// CallByteMethod calls a method on an object, returning a byte. +func CallByteMethod(e Env, obj Object, method MethodID, args ...Value) (byte, error) { + res := C._jni_CallByteMethodA(e.env, C.jobject(obj), C.jmethodID(method), varArgs(args)) + return byte(res), exception(e) +} + +// CallCharMethod calls a method on an object, returning a rune. +func CallCharMethod(e Env, obj Object, method MethodID, args ...Value) (rune, error) { + res := C._jni_CallCharMethodA(e.env, C.jobject(obj), C.jmethodID(method), varArgs(args)) + return rune(res), exception(e) +} + +// CallShortMethod calls a method on an object, returning an int32. +func CallShortMethod(e Env, obj Object, method MethodID, args ...Value) (int16, error) { + res := C._jni_CallShortMethodA(e.env, C.jobject(obj), C.jmethodID(method), varArgs(args)) + return int16(res), exception(e) +} + +// CallLongMethod calls a method on an object, returning an int64. +func CallLongMethod(e Env, obj Object, method MethodID, args ...Value) (int64, error) { + res := C._jni_CallLongMethodA(e.env, C.jobject(obj), C.jmethodID(method), varArgs(args)) + return int64(res), exception(e) +} + +// CallFloatMethod calls a method on an object, returning a float32. +func CallFloatMethod(e Env, obj Object, method MethodID, args ...Value) (float32, error) { + res := C._jni_CallFloatMethodA(e.env, C.jobject(obj), C.jmethodID(method), varArgs(args)) + return float32(res), exception(e) +} + +// CallDoubleMethod calls a method on an object, returning a float64. +func CallDoubleMethod(e Env, obj Object, method MethodID, args ...Value) (float64, error) { + res := C._jni_CallDoubleMethodA(e.env, C.jobject(obj), C.jmethodID(method), varArgs(args)) + return float64(res), exception(e) +} + // GetByteArrayElements returns the contents of the array. func GetByteArrayElements(e Env, jarr ByteArray) []byte { size := C._jni_GetArrayLength(e.env, C.jarray(jarr))