summaryrefslogtreecommitdiff
path: root/src/runtime/java/jni_utils.c
diff options
context:
space:
mode:
authorkrasimir <krasimir@chalmers.se>2017-04-13 13:21:32 +0000
committerkrasimir <krasimir@chalmers.se>2017-04-13 13:21:32 +0000
commite650b9c5fc38ebb408ddf1982249479aac73836d (patch)
treeb2638469c6a5ff7f8b9f94f2d24543774e83be83 /src/runtime/java/jni_utils.c
parent9aeb45e1cca177ccf5bb386f90a213c247238255 (diff)
use gu_string_buf_data in the Java binding to avoid double copying of strings
Diffstat (limited to 'src/runtime/java/jni_utils.c')
-rw-r--r--src/runtime/java/jni_utils.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/runtime/java/jni_utils.c b/src/runtime/java/jni_utils.c
index 64352e157..120233975 100644
--- a/src/runtime/java/jni_utils.c
+++ b/src/runtime/java/jni_utils.c
@@ -33,6 +33,29 @@ gu2j_string(JNIEnv *env, GuString s) {
return (*env)->NewString(env, utf16, dst-utf16);
}
+jstring
+gu2j_string_buf(JNIEnv *env, GuStringBuf* sbuf) {
+ const char* s = gu_string_buf_data(sbuf);
+ const char* utf8 = s;
+ size_t len = gu_string_buf_length(sbuf);
+
+ jchar* utf16 = alloca(len*sizeof(jchar));
+ jchar* dst = utf16;
+ while (s-utf8 < len) {
+ GuUCS ucs = gu_utf8_decode((const uint8_t**) &s);
+
+ if (ucs <= 0xFFFF) {
+ *dst++ = ucs;
+ } else {
+ ucs -= 0x10000;
+ *dst++ = 0xD800+((ucs >> 10) & 0x3FF);
+ *dst++ = 0xDC00+(ucs & 0x3FF);
+ }
+ }
+
+ return (*env)->NewString(env, utf16, dst-utf16);
+}
+
GuString
j2gu_string(JNIEnv *env, jstring s, GuPool* pool) {
GuString str = (*env)->GetStringUTFChars(env, s, 0);