Skip to content

Commit f3299ef

Browse files
WhiredPlanckBambooin
authored andcommitted
refactor(jni): split objconv.h from rime_jni.cc
1 parent 75d121a commit f3299ef

File tree

8 files changed

+140
-156
lines changed

8 files changed

+140
-156
lines changed

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

-17
This file was deleted.

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

+2
Original file line numberDiff line numberDiff line change
@@ -242,4 +242,6 @@ class GlobalRefSingleton {
242242
const JEnv AttachEnv() const { return JEnv(jvm); }
243243
};
244244

245+
extern GlobalRefSingleton *GlobalRef;
246+
245247
#endif //TRIME_JNI_UTILS_H

app/src/main/jni/librime_jni/key_table.cc

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
#include <rime/key_table.h>
2-
#include "rime_jni.h"
32
#include "jni-utils.h"
43

54
extern "C"

app/src/main/jni/librime_jni/levers.cc

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
#include "jni-common.h"
2-
#include "rime_jni.h"
1+
#include <rime_levers_api.h>
2+
#include "jni-utils.h"
3+
#include "objconv.h"
34

45
// customize settings
56

+130
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
#ifndef TRIME_OBJCONV_H
2+
#define TRIME_OBJCONV_H
3+
4+
#include <rime_api.h>
5+
#include "jni-utils.h"
6+
7+
inline void rimeCommitToJObject(JNIEnv *env, const RimeCommit &commit, const jobject &jcommit) {
8+
env->SetObjectField(jcommit, GlobalRef->RimeCommitText, JString(env, commit.text));
9+
}
10+
11+
inline void rimeContextToJObject(JNIEnv *env, const RimeContext &context, const jobject &jcontext) {
12+
auto composition = JRef<>(env, env->AllocObject(GlobalRef->RimeComposition));
13+
env->SetIntField(composition, GlobalRef->RimeCompositionLength, context.composition.length);
14+
env->SetIntField(composition, GlobalRef->RimeCompositionCursorPos,
15+
context.composition.cursor_pos);
16+
env->SetIntField(composition, GlobalRef->RimeCompositionSelStart,
17+
context.composition.sel_start);
18+
env->SetIntField(composition, GlobalRef->RimeCompositionSelEnd,
19+
context.composition.sel_end);
20+
env->SetObjectField(composition, GlobalRef->RimeCompositionPreedit,
21+
JString(env, context.composition.preedit));
22+
env->SetObjectField(jcontext, GlobalRef->RimeContextComposition, composition);
23+
24+
const auto &menu = context.menu;
25+
auto jmenu = JRef<>(env, env->AllocObject(GlobalRef->RimeMenu));
26+
env->SetIntField(jmenu, GlobalRef->RimeMenuPageSize, menu.page_size);
27+
env->SetIntField(jmenu, GlobalRef->RimeMenuPageNo, menu.page_no);
28+
env->SetBooleanField(jmenu, GlobalRef->RimeMenuIsLastPage, menu.is_last_page);
29+
env->SetIntField(jmenu, GlobalRef->RimeMenuHighlightedCandidateIndex,
30+
menu.highlighted_candidate_index);
31+
env->SetIntField(jmenu, GlobalRef->RimeMenuNumCandidates, context.menu.num_candidates);
32+
33+
size_t numSelectKeys = menu.select_keys ? std::strlen(menu.select_keys) : 0;
34+
bool hasLabel = RIME_STRUCT_HAS_MEMBER(context, context.select_labels) && context.select_labels;
35+
auto selectLabels = JRef<jobjectArray>(env, env->NewObjectArray(menu.num_candidates, GlobalRef->String, nullptr));
36+
auto candidates = JRef<jobjectArray>(env, env->NewObjectArray(menu.num_candidates, GlobalRef->CandidateListItem, nullptr));
37+
for (int i = 0; i < menu.num_candidates; ++i) {
38+
std::string label;
39+
if (i < menu.page_size && hasLabel) {
40+
label = context.select_labels[i];
41+
} else if (i < numSelectKeys) {
42+
label = std::string(1, menu.select_keys[i]);
43+
} else {
44+
label = std::to_string((i + 1) % 10);
45+
}
46+
label.append(" ");
47+
env->SetObjectArrayElement(selectLabels, i, JString(env, label));
48+
auto &candidate = context.menu.candidates[i];
49+
auto jcandidate = JRef<>(env, env->NewObject(GlobalRef->CandidateListItem, GlobalRef->CandidateListItemInit,
50+
*JString(env, candidate.comment ? candidate.comment : ""),
51+
*JString(env, candidate.text ? candidate.text : "")));
52+
env->SetObjectArrayElement(candidates, i, jcandidate);
53+
}
54+
env->SetObjectField(jmenu, GlobalRef->RimeMenuCandidates, candidates);
55+
56+
env->SetObjectField(jcontext, GlobalRef->RimeContextMenu, jmenu);
57+
env->SetObjectField(jcontext, GlobalRef->RimeContextCommitTextPreview, JString(env, context.commit_text_preview));
58+
env->SetObjectField(jcontext, GlobalRef->RimeContextSelectLabels, selectLabels);
59+
}
60+
61+
inline void rimeStatusToJObject(JNIEnv *env, const RimeStatus &status, const jobject &jstatus) {
62+
env->SetObjectField(jstatus, GlobalRef->RimeStatusSchemaId, JString(env, status.schema_id));
63+
env->SetObjectField(jstatus, GlobalRef->RimeStatusSchemaName, JString(env, status.schema_name));
64+
env->SetBooleanField(jstatus, GlobalRef->RimeStatusDisable, status.is_disabled);
65+
env->SetBooleanField(jstatus, GlobalRef->RimeStatusComposing, status.is_composing);
66+
env->SetBooleanField(jstatus, GlobalRef->RimeStatusAsciiMode, status.is_ascii_mode);
67+
env->SetBooleanField(jstatus, GlobalRef->RimeStatusFullShape, status.is_full_shape);
68+
env->SetBooleanField(jstatus, GlobalRef->RimeStatusSimplified, status.is_simplified);
69+
env->SetBooleanField(jstatus, GlobalRef->RimeStatusTraditional, status.is_traditional);
70+
env->SetBooleanField(jstatus, GlobalRef->RimeStatusAsciiPunct, status.is_ascii_punct);
71+
}
72+
73+
inline jobject rimeConfigValueToJObject(JNIEnv *env, RimeConfig *config, const std::string &key);
74+
75+
inline jobject rimeConfigListToJObject(JNIEnv *env, RimeConfig* config, const std::string &key) {
76+
auto rime = rime_get_api();
77+
RimeConfigIterator iter = {nullptr};
78+
if (!rime->config_begin_list(&iter, config, key.c_str())) return nullptr;
79+
auto size = rime->config_list_size(config, key.c_str());
80+
auto obj = env->NewObject(GlobalRef->ArrayList, GlobalRef->ArrayListInit, size);
81+
int i = 0;
82+
while (RimeConfigNext(&iter)) {
83+
auto e = JRef<>(env, rimeConfigValueToJObject(env, config, iter.path));
84+
env->CallVoidMethod(obj, GlobalRef->ArrayListAdd, i++, *e);
85+
}
86+
rime->config_end(&iter);
87+
return obj;
88+
}
89+
90+
inline jobject rimeConfigMapToJObject(JNIEnv *env, RimeConfig *config, const std::string &key) {
91+
auto rime = rime_get_api();
92+
RimeConfigIterator iter = {nullptr};
93+
if (!rime->config_begin_map(&iter, config, key.c_str())) return nullptr;
94+
auto obj = env->NewObject(GlobalRef->HashMap, GlobalRef->HashMapInit);
95+
while (rime->config_next(&iter)) {
96+
auto v = JRef<>(env, rimeConfigValueToJObject(env, config, iter.path));
97+
env->CallObjectMethod(obj, GlobalRef->HashMapPut, *JString(env, iter.key), *v);
98+
}
99+
rime->config_end(&iter);
100+
return obj;
101+
}
102+
103+
inline jobject rimeConfigValueToJObject(JNIEnv *env, RimeConfig *config, const std::string &key) {
104+
auto rime = rime_get_api();
105+
106+
const char *value;
107+
if ((value = rime->config_get_cstring(config, key.c_str()))) {
108+
return env->NewStringUTF(value);
109+
}
110+
jobject list;
111+
if ((list = rimeConfigListToJObject(env, config, key))) {
112+
return list;
113+
}
114+
return rimeConfigMapToJObject(env, config, key);
115+
}
116+
117+
inline jobjectArray rimeSchemaListToJObjectArray(JNIEnv *env, RimeSchemaList &list) {
118+
jobjectArray array = env->NewObjectArray(static_cast<int>(list.size), GlobalRef->SchemaListItem,
119+
nullptr);
120+
for (int i = 0; i < list.size; i++) {
121+
auto item = list.list[i];
122+
auto obj = JRef<>(env, env->NewObject(GlobalRef->SchemaListItem, GlobalRef->SchemaListItemInit,
123+
*JString(env, item.schema_id),
124+
*JString(env, item.name)));
125+
env->SetObjectArrayElement(array, i, obj);
126+
}
127+
return array;
128+
}
129+
130+
#endif //TRIME_OBJCONV_H

app/src/main/jni/librime_jni/opencc.cc

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
#include <opencc/Common.hpp>
33
#include <opencc/SimpleConverter.hpp>
44
#include <opencc/DictConverter.hpp>
5-
#include "rime_jni.h"
65
#include "jni-utils.h"
76

87
// opencc

app/src/main/jni/librime_jni/rime_jni.cc

+5-125
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
#include <string>
2-
#include "rime_jni.h"
3-
#include "jni-common.h"
2+
#include <rime_api.h>
3+
#include "jni-utils.h"
4+
#include "objconv.h"
5+
6+
#define MAX_BUFFER_LENGTH 2048
47

58
extern void rime_require_module_lua();
69
extern void rime_require_module_charcode();
@@ -154,8 +157,6 @@ JNI_OnLoad(JavaVM* jvm, void* reserved)
154157
return JNI_VERSION_1_6;
155158
}
156159

157-
static jobject rimeConfigValueToJObject(JNIEnv *env, RimeConfig* config, const std::string &key);
158-
159160
extern "C"
160161
JNIEXPORT void JNICALL
161162
Java_com_osfans_trime_core_Rime_startupRime(JNIEnv *env, jclass clazz, jstring shared_dir, jstring user_dir,
@@ -219,10 +220,6 @@ Java_com_osfans_trime_core_Rime_clearRimeComposition(JNIEnv *env, jclass /* thiz
219220
Rime::Instance().clearComposition();
220221
}
221222

222-
void rimeCommitToJObject(JNIEnv *env, const RimeCommit &commit, const jobject &jcommit) {
223-
env->SetObjectField(jcommit, GlobalRef->RimeCommitText, JString(env, commit.text));
224-
}
225-
226223
// output
227224
extern "C"
228225
JNIEXPORT jboolean JNICALL
@@ -238,56 +235,6 @@ Java_com_osfans_trime_core_Rime_getRimeCommit(JNIEnv *env, jclass /* thiz */, jo
238235
return false;
239236
}
240237

241-
void rimeContextToJObject(JNIEnv *env, const RimeContext &context, const jobject &jcontext) {
242-
auto composition = JRef<>(env, env->AllocObject(GlobalRef->RimeComposition));
243-
env->SetIntField(composition, GlobalRef->RimeCompositionLength, context.composition.length);
244-
env->SetIntField(composition, GlobalRef->RimeCompositionCursorPos,
245-
context.composition.cursor_pos);
246-
env->SetIntField(composition, GlobalRef->RimeCompositionSelStart,
247-
context.composition.sel_start);
248-
env->SetIntField(composition, GlobalRef->RimeCompositionSelEnd,
249-
context.composition.sel_end);
250-
env->SetObjectField(composition, GlobalRef->RimeCompositionPreedit,
251-
JString(env, context.composition.preedit));
252-
env->SetObjectField(jcontext, GlobalRef->RimeContextComposition, composition);
253-
254-
const auto &menu = context.menu;
255-
auto jmenu = JRef<>(env, env->AllocObject(GlobalRef->RimeMenu));
256-
env->SetIntField(jmenu, GlobalRef->RimeMenuPageSize, menu.page_size);
257-
env->SetIntField(jmenu, GlobalRef->RimeMenuPageNo, menu.page_no);
258-
env->SetBooleanField(jmenu, GlobalRef->RimeMenuIsLastPage, menu.is_last_page);
259-
env->SetIntField(jmenu, GlobalRef->RimeMenuHighlightedCandidateIndex,
260-
menu.highlighted_candidate_index);
261-
env->SetIntField(jmenu, GlobalRef->RimeMenuNumCandidates, context.menu.num_candidates);
262-
263-
size_t numSelectKeys = menu.select_keys ? std::strlen(menu.select_keys) : 0;
264-
bool hasLabel = RIME_STRUCT_HAS_MEMBER(context, context.select_labels) && context.select_labels;
265-
auto selectLabels = JRef<jobjectArray>(env, env->NewObjectArray(menu.num_candidates, GlobalRef->String, nullptr));
266-
auto candidates = JRef<jobjectArray>(env, env->NewObjectArray(menu.num_candidates, GlobalRef->CandidateListItem, nullptr));
267-
for (int i = 0; i < menu.num_candidates; ++i) {
268-
std::string label;
269-
if (i < menu.page_size && hasLabel) {
270-
label = context.select_labels[i];
271-
} else if (i < numSelectKeys) {
272-
label = std::string(1, menu.select_keys[i]);
273-
} else {
274-
label = std::to_string((i + 1) % 10);
275-
}
276-
label.append(" ");
277-
env->SetObjectArrayElement(selectLabels, i, JString(env, label));
278-
auto &candidate = context.menu.candidates[i];
279-
auto jcandidate = JRef<>(env, env->NewObject(GlobalRef->CandidateListItem, GlobalRef->CandidateListItemInit,
280-
*JString(env, candidate.comment ? candidate.comment : ""),
281-
*JString(env, candidate.text ? candidate.text : "")));
282-
env->SetObjectArrayElement(candidates, i, jcandidate);
283-
}
284-
env->SetObjectField(jmenu, GlobalRef->RimeMenuCandidates, candidates);
285-
286-
env->SetObjectField(jcontext, GlobalRef->RimeContextMenu, jmenu);
287-
env->SetObjectField(jcontext, GlobalRef->RimeContextCommitTextPreview, JString(env, context.commit_text_preview));
288-
env->SetObjectField(jcontext, GlobalRef->RimeContextSelectLabels, selectLabels);
289-
}
290-
291238
extern "C"
292239
JNIEXPORT jboolean JNICALL
293240
Java_com_osfans_trime_core_Rime_getRimeContext(JNIEnv *env, jclass /* thiz */, jobject jcontext) {
@@ -302,18 +249,6 @@ Java_com_osfans_trime_core_Rime_getRimeContext(JNIEnv *env, jclass /* thiz */, j
302249
return false;
303250
}
304251

305-
void rimeStatusToJObject(JNIEnv *env, const RimeStatus &status, const jobject &jstatus) {
306-
env->SetObjectField(jstatus, GlobalRef->RimeStatusSchemaId, JString(env, status.schema_id));
307-
env->SetObjectField(jstatus, GlobalRef->RimeStatusSchemaName, JString(env, status.schema_name));
308-
env->SetBooleanField(jstatus, GlobalRef->RimeStatusDisable, status.is_disabled);
309-
env->SetBooleanField(jstatus, GlobalRef->RimeStatusComposing, status.is_composing);
310-
env->SetBooleanField(jstatus, GlobalRef->RimeStatusAsciiMode, status.is_ascii_mode);
311-
env->SetBooleanField(jstatus, GlobalRef->RimeStatusFullShape, status.is_full_shape);
312-
env->SetBooleanField(jstatus, GlobalRef->RimeStatusSimplified, status.is_simplified);
313-
env->SetBooleanField(jstatus, GlobalRef->RimeStatusTraditional, status.is_traditional);
314-
env->SetBooleanField(jstatus, GlobalRef->RimeStatusAsciiPunct, status.is_ascii_punct);
315-
}
316-
317252
extern "C"
318253
JNIEXPORT jboolean JNICALL
319254
Java_com_osfans_trime_core_Rime_getRimeStatus(JNIEnv *env, jclass /* thiz */, jobject jstatus) {
@@ -377,19 +312,6 @@ Java_com_osfans_trime_core_Rime_getRimeOption(JNIEnv *env, jclass /* thiz */, js
377312
return Rime::Instance().getOption(CString(env, option));
378313
}
379314

380-
jobjectArray rimeSchemaListToJObjectArray(JNIEnv *env, RimeSchemaList &list) {
381-
jobjectArray array = env->NewObjectArray(static_cast<int>(list.size), GlobalRef->SchemaListItem,
382-
nullptr);
383-
for (int i = 0; i < list.size; i++) {
384-
auto item = list.list[i];
385-
auto obj = JRef<>(env, env->NewObject(GlobalRef->SchemaListItem, GlobalRef->SchemaListItemInit,
386-
*JString(env, item.schema_id),
387-
*JString(env, item.name)));
388-
env->SetObjectArrayElement(array, i, obj);
389-
}
390-
return array;
391-
}
392-
393315
extern "C"
394316
JNIEXPORT jobjectArray JNICALL
395317
Java_com_osfans_trime_core_Rime_getRimeSchemaList(JNIEnv *env, jclass /* thiz */) {
@@ -472,34 +394,6 @@ Java_com_osfans_trime_core_Rime_getLibrimeVersion(JNIEnv *env, jclass /* thiz */
472394
return env->NewStringUTF(LIBRIME_VERSION);
473395
}
474396

475-
static jobject rimeConfigListToJObject(JNIEnv *env, RimeConfig* config, const std::string &key) {
476-
auto rime = rime_get_api();
477-
RimeConfigIterator iter = {nullptr};
478-
if (!rime->config_begin_list(&iter, config, key.c_str())) return nullptr;
479-
auto size = rime->config_list_size(config, key.c_str());
480-
auto obj = env->NewObject(GlobalRef->ArrayList, GlobalRef->ArrayListInit, size);
481-
int i = 0;
482-
while (RimeConfigNext(&iter)) {
483-
auto e = JRef<>(env, rimeConfigValueToJObject(env, config, iter.path));
484-
env->CallVoidMethod(obj, GlobalRef->ArrayListAdd, i++, *e);
485-
}
486-
rime->config_end(&iter);
487-
return obj;
488-
}
489-
490-
static jobject rimeConfigMapToJObject(JNIEnv *env, RimeConfig *config, const std::string &key) {
491-
auto rime = rime_get_api();
492-
RimeConfigIterator iter = {nullptr};
493-
if (!rime->config_begin_map(&iter, config, key.c_str())) return nullptr;
494-
auto obj = env->NewObject(GlobalRef->HashMap, GlobalRef->HashMapInit);
495-
while (rime->config_next(&iter)) {
496-
auto v = JRef<>(env, rimeConfigValueToJObject(env, config, iter.path));
497-
env->CallObjectMethod(obj, GlobalRef->HashMapPut, *JString(env, iter.key), *v);
498-
}
499-
rime->config_end(&iter);
500-
return obj;
501-
}
502-
503397
extern "C"
504398
JNIEXPORT jobject JNICALL
505399
Java_com_osfans_trime_core_Rime_getRimeConfigMap(JNIEnv *env, jclass clazz, jstring config_id, jstring key) {
@@ -513,20 +407,6 @@ Java_com_osfans_trime_core_Rime_getRimeConfigMap(JNIEnv *env, jclass clazz, jstr
513407
return value;
514408
}
515409

516-
jobject rimeConfigValueToJObject(JNIEnv *env, RimeConfig *config, const std::string &key) {
517-
auto rime = rime_get_api();
518-
519-
const char *value;
520-
if ((value = rime->config_get_cstring(config, key.c_str()))) {
521-
return env->NewStringUTF(value);
522-
}
523-
jobject list;
524-
if ((list = rimeConfigListToJObject(env, config, key))) {
525-
return list;
526-
}
527-
return rimeConfigMapToJObject(env, config, key);
528-
}
529-
530410
extern "C"
531411
JNIEXPORT jboolean JNICALL
532412
Java_com_osfans_trime_core_Rime_runRimeTask(JNIEnv *env, jclass /* thiz */, jstring task_name) {

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

-10
This file was deleted.

0 commit comments

Comments
 (0)