diff --git a/gojni.h b/gojni.h index 9a1e065..ae552d6 100644 --- a/gojni.h +++ b/gojni.h @@ -15,6 +15,7 @@ __attribute__ ((visibility ("hidden"))) jfieldID _jni_GetFieldID(JNIEnv *env, jc __attribute__ ((visibility ("hidden"))) jfieldID _jni_GetStaticFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig); __attribute__ ((visibility ("hidden"))) jsize _jni_GetStringLength(JNIEnv *env, jstring str); __attribute__ ((visibility ("hidden"))) const jchar *_jni_GetStringChars(JNIEnv *env, jstring str); +__attribute__ ((visibility ("hidden"))) void _jni_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars); __attribute__ ((visibility ("hidden"))) jstring _jni_NewString(JNIEnv *env, const jchar *unicodeChars, jsize len); __attribute__ ((visibility ("hidden"))) jboolean _jni_IsSameObject(JNIEnv *env, jobject ref1, jobject ref2); __attribute__ ((visibility ("hidden"))) jboolean _jni_IsInstanceOf(JNIEnv *env, jobject obj, jclass cls); diff --git a/jni.c b/jni.c index e66bd9f..c030eb2 100644 --- a/jni.c +++ b/jni.c @@ -78,6 +78,10 @@ const jchar *_jni_GetStringChars(JNIEnv *env, jstring str) { return (*env)->GetStringChars(env, str, NULL); } +void _jni_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars) { + (*env)->ReleaseStringChars(env, str, chars); +} + jstring _jni_NewString(JNIEnv *env, const jchar *unicodeChars, jsize len) { return (*env)->NewString(env, unicodeChars, len); } diff --git a/jni.go b/jni.go index 6035453..dea3b93 100644 --- a/jni.go +++ b/jni.go @@ -411,6 +411,10 @@ func GoString(e Env, str String) string { } strlen := C._jni_GetStringLength(e.env, C.jstring(str)) chars := C._jni_GetStringChars(e.env, C.jstring(str)) + if chars == nil { + return "" + } + defer C._jni_ReleaseStringChars(e.env, C.jstring(str), chars) var utf16Chars []uint16 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&utf16Chars)) hdr.Data = uintptr(unsafe.Pointer(chars))