diff options
| author | krasimir <krasimir@chalmers.se> | 2017-04-13 13:21:32 +0000 |
|---|---|---|
| committer | krasimir <krasimir@chalmers.se> | 2017-04-13 13:21:32 +0000 |
| commit | e650b9c5fc38ebb408ddf1982249479aac73836d (patch) | |
| tree | b2638469c6a5ff7f8b9f94f2d24543774e83be83 /src/runtime/java/jni_utils.c | |
| parent | 9aeb45e1cca177ccf5bb386f90a213c247238255 (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.c | 23 |
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); |
