Skip to content

Commit b95633a

Browse files
committed
feat(jni): use NewString to create jstring
Converting string from UTF-8 to UTF-16 before creating jstring could help us to avoid some exceptions.
1 parent 5159f57 commit b95633a

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

app/src/main/jni/librime_jni/jni-utils.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#define TRIME_JNI_UTILS_H
77

88
#include <jni.h>
9+
#include <utf8.h>
910

1011
#include <string>
1112

@@ -61,9 +62,16 @@ class JString {
6162
JNIEnv *env_;
6263
jstring jstring_;
6364

65+
static inline jstring toJString(JNIEnv *env, const char *chars) {
66+
if (chars == nullptr) return nullptr;
67+
auto u16str = utf8::utf8to16(chars);
68+
return env->NewString(reinterpret_cast<const jchar *>(u16str.data()),
69+
static_cast<int>(u16str.length()));
70+
}
71+
6472
public:
6573
JString(JNIEnv *env, const char *chars)
66-
: env_(env), jstring_(env->NewStringUTF(chars)) {}
74+
: env_(env), jstring_(toJString(env, chars)) {}
6775

6876
JString(JNIEnv *env, const std::string &string)
6977
: JString(env, string.c_str()) {}

app/src/main/jni/librime_jni/objconv.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ inline jobject rimeContextToJObject(JNIEnv *env, const RimeContext &context) {
2020
env->NewObject(GlobalRef->RimeComposition, GlobalRef->RimeCompositionInit,
2121
context.composition.length, context.composition.cursor_pos,
2222
context.composition.sel_start, context.composition.sel_end,
23-
*JString(env, context.composition.preedit)));
23+
*JString(env, context.composition.preedit
24+
? context.composition.preedit
25+
: "")));
2426

2527
const auto &menu = context.menu;
2628

@@ -50,7 +52,7 @@ inline jobject rimeContextToJObject(JNIEnv *env, const RimeContext &context) {
5052
env, env->NewObject(
5153
GlobalRef->CandidateListItem, GlobalRef->CandidateListItemInit,
5254
*JString(env, candidate.comment ? candidate.comment : ""),
53-
*JString(env, candidate.text ? candidate.text : "")));
55+
*JString(env, candidate.text)));
5456
env->SetObjectArrayElement(candidates, i, jcandidate);
5557
}
5658

@@ -62,7 +64,9 @@ inline jobject rimeContextToJObject(JNIEnv *env, const RimeContext &context) {
6264

6365
return env->NewObject(
6466
GlobalRef->RimeContext, GlobalRef->RimeContextInit, *jcomposition, *jmenu,
65-
*JString(env, context.commit_text_preview), *selectLabels);
67+
*JString(env,
68+
context.commit_text_preview ? context.commit_text_preview : ""),
69+
*selectLabels);
6670
}
6771

6872
inline jobject rimeStatusToJObject(JNIEnv *env, const RimeStatus &status) {

0 commit comments

Comments
 (0)