1*993b0882SAndroid Build Coastguard Worker /*
2*993b0882SAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project
3*993b0882SAndroid Build Coastguard Worker *
4*993b0882SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*993b0882SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*993b0882SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*993b0882SAndroid Build Coastguard Worker *
8*993b0882SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*993b0882SAndroid Build Coastguard Worker *
10*993b0882SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*993b0882SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*993b0882SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*993b0882SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*993b0882SAndroid Build Coastguard Worker * limitations under the License.
15*993b0882SAndroid Build Coastguard Worker */
16*993b0882SAndroid Build Coastguard Worker
17*993b0882SAndroid Build Coastguard Worker #include "utils/java/jni-cache.h"
18*993b0882SAndroid Build Coastguard Worker
19*993b0882SAndroid Build Coastguard Worker #include "utils/base/logging.h"
20*993b0882SAndroid Build Coastguard Worker #include "utils/base/status_macros.h"
21*993b0882SAndroid Build Coastguard Worker #include "utils/java/jni-base.h"
22*993b0882SAndroid Build Coastguard Worker #include "utils/java/jni-helper.h"
23*993b0882SAndroid Build Coastguard Worker
24*993b0882SAndroid Build Coastguard Worker namespace libtextclassifier3 {
25*993b0882SAndroid Build Coastguard Worker
JniCache(JavaVM * jvm)26*993b0882SAndroid Build Coastguard Worker JniCache::JniCache(JavaVM* jvm)
27*993b0882SAndroid Build Coastguard Worker : jvm(jvm),
28*993b0882SAndroid Build Coastguard Worker string_class(nullptr, jvm),
29*993b0882SAndroid Build Coastguard Worker string_utf8(nullptr, jvm),
30*993b0882SAndroid Build Coastguard Worker pattern_class(nullptr, jvm),
31*993b0882SAndroid Build Coastguard Worker matcher_class(nullptr, jvm),
32*993b0882SAndroid Build Coastguard Worker locale_class(nullptr, jvm),
33*993b0882SAndroid Build Coastguard Worker locale_us(nullptr, jvm),
34*993b0882SAndroid Build Coastguard Worker breakiterator_class(nullptr, jvm),
35*993b0882SAndroid Build Coastguard Worker integer_class(nullptr, jvm),
36*993b0882SAndroid Build Coastguard Worker calendar_class(nullptr, jvm),
37*993b0882SAndroid Build Coastguard Worker timezone_class(nullptr, jvm)
38*993b0882SAndroid Build Coastguard Worker #ifdef __ANDROID__
39*993b0882SAndroid Build Coastguard Worker ,
40*993b0882SAndroid Build Coastguard Worker context_class(nullptr, jvm),
41*993b0882SAndroid Build Coastguard Worker uri_class(nullptr, jvm),
42*993b0882SAndroid Build Coastguard Worker usermanager_class(nullptr, jvm),
43*993b0882SAndroid Build Coastguard Worker bundle_class(nullptr, jvm),
44*993b0882SAndroid Build Coastguard Worker resources_class(nullptr, jvm)
45*993b0882SAndroid Build Coastguard Worker #endif
46*993b0882SAndroid Build Coastguard Worker {
47*993b0882SAndroid Build Coastguard Worker }
48*993b0882SAndroid Build Coastguard Worker
49*993b0882SAndroid Build Coastguard Worker // The macros below are intended to reduce the boilerplate in Create and avoid
50*993b0882SAndroid Build Coastguard Worker // easily introduced copy/paste errors.
51*993b0882SAndroid Build Coastguard Worker #define TC3_CHECK_JNI_PTR(PTR) TC3_CHECK((PTR) != nullptr)
52*993b0882SAndroid Build Coastguard Worker #define TC3_CHECK_JNI_RESULT(RESULT) TC3_CHECK(RESULT)
53*993b0882SAndroid Build Coastguard Worker
54*993b0882SAndroid Build Coastguard Worker #define TC3_GET_CLASS_OR_RETURN_NULL(FIELD, NAME) \
55*993b0882SAndroid Build Coastguard Worker { \
56*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN_NULL(ScopedLocalRef<jclass> clazz, \
57*993b0882SAndroid Build Coastguard Worker JniHelper::FindClass(env, NAME)); \
58*993b0882SAndroid Build Coastguard Worker result->FIELD##_class = MakeGlobalRef(clazz.get(), env, jvm); \
59*993b0882SAndroid Build Coastguard Worker if (result->FIELD##_class == nullptr) { \
60*993b0882SAndroid Build Coastguard Worker TC3_LOG(ERROR) << "Error finding class: " << NAME; \
61*993b0882SAndroid Build Coastguard Worker return nullptr; \
62*993b0882SAndroid Build Coastguard Worker } \
63*993b0882SAndroid Build Coastguard Worker }
64*993b0882SAndroid Build Coastguard Worker
65*993b0882SAndroid Build Coastguard Worker #define TC3_GET_OPTIONAL_CLASS(FIELD, NAME) \
66*993b0882SAndroid Build Coastguard Worker { \
67*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jclass>> status_or_class = \
68*993b0882SAndroid Build Coastguard Worker JniHelper::FindClass(env, NAME); \
69*993b0882SAndroid Build Coastguard Worker if (status_or_class.ok()) { \
70*993b0882SAndroid Build Coastguard Worker result->FIELD##_class = MakeGlobalRef( \
71*993b0882SAndroid Build Coastguard Worker std::move(status_or_class).ValueOrDie().get(), env, jvm); \
72*993b0882SAndroid Build Coastguard Worker } \
73*993b0882SAndroid Build Coastguard Worker }
74*993b0882SAndroid Build Coastguard Worker
75*993b0882SAndroid Build Coastguard Worker #define TC3_GET_METHOD(CLASS, FIELD, NAME, SIGNATURE) \
76*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN_NULL( \
77*993b0882SAndroid Build Coastguard Worker result->CLASS##_##FIELD, \
78*993b0882SAndroid Build Coastguard Worker JniHelper::GetMethodID(env, result->CLASS##_class.get(), NAME, \
79*993b0882SAndroid Build Coastguard Worker SIGNATURE));
80*993b0882SAndroid Build Coastguard Worker
81*993b0882SAndroid Build Coastguard Worker #define TC3_GET_OPTIONAL_METHOD(CLASS, FIELD, NAME, SIGNATURE) \
82*993b0882SAndroid Build Coastguard Worker TC3_GET_OPTIONAL_METHOD_INTERNAL(CLASS, FIELD, NAME, SIGNATURE, GetMethodID)
83*993b0882SAndroid Build Coastguard Worker
84*993b0882SAndroid Build Coastguard Worker #define TC3_GET_OPTIONAL_STATIC_METHOD(CLASS, FIELD, NAME, SIGNATURE) \
85*993b0882SAndroid Build Coastguard Worker TC3_GET_OPTIONAL_METHOD_INTERNAL(CLASS, FIELD, NAME, SIGNATURE, \
86*993b0882SAndroid Build Coastguard Worker GetStaticMethodID)
87*993b0882SAndroid Build Coastguard Worker
88*993b0882SAndroid Build Coastguard Worker #define TC3_GET_OPTIONAL_METHOD_INTERNAL(CLASS, FIELD, NAME, SIGNATURE, \
89*993b0882SAndroid Build Coastguard Worker METHOD_NAME) \
90*993b0882SAndroid Build Coastguard Worker if (result->CLASS##_class != nullptr) { \
91*993b0882SAndroid Build Coastguard Worker if (StatusOr<jmethodID> status_or_method_id = JniHelper::METHOD_NAME( \
92*993b0882SAndroid Build Coastguard Worker env, result->CLASS##_class.get(), NAME, SIGNATURE); \
93*993b0882SAndroid Build Coastguard Worker status_or_method_id.ok()) { \
94*993b0882SAndroid Build Coastguard Worker result->CLASS##_##FIELD = status_or_method_id.ValueOrDie(); \
95*993b0882SAndroid Build Coastguard Worker } \
96*993b0882SAndroid Build Coastguard Worker }
97*993b0882SAndroid Build Coastguard Worker
98*993b0882SAndroid Build Coastguard Worker #define TC3_GET_STATIC_METHOD(CLASS, FIELD, NAME, SIGNATURE) \
99*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN_NULL( \
100*993b0882SAndroid Build Coastguard Worker result->CLASS##_##FIELD, \
101*993b0882SAndroid Build Coastguard Worker JniHelper::GetStaticMethodID(env, result->CLASS##_class.get(), NAME, \
102*993b0882SAndroid Build Coastguard Worker SIGNATURE));
103*993b0882SAndroid Build Coastguard Worker
104*993b0882SAndroid Build Coastguard Worker #define TC3_GET_STATIC_OBJECT_FIELD_OR_RETURN_NULL(CLASS, FIELD, NAME, \
105*993b0882SAndroid Build Coastguard Worker SIGNATURE) \
106*993b0882SAndroid Build Coastguard Worker { \
107*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN_NULL( \
108*993b0882SAndroid Build Coastguard Worker const jfieldID CLASS##_##FIELD##_field, \
109*993b0882SAndroid Build Coastguard Worker JniHelper::GetStaticFieldID(env, result->CLASS##_class.get(), NAME, \
110*993b0882SAndroid Build Coastguard Worker SIGNATURE)); \
111*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN_NULL( \
112*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jobject> static_object, \
113*993b0882SAndroid Build Coastguard Worker JniHelper::GetStaticObjectField(env, result->CLASS##_class.get(), \
114*993b0882SAndroid Build Coastguard Worker CLASS##_##FIELD##_field)); \
115*993b0882SAndroid Build Coastguard Worker result->CLASS##_##FIELD = MakeGlobalRef(static_object.get(), env, jvm); \
116*993b0882SAndroid Build Coastguard Worker if (result->CLASS##_##FIELD == nullptr) { \
117*993b0882SAndroid Build Coastguard Worker TC3_LOG(ERROR) << "Error finding field: " << NAME; \
118*993b0882SAndroid Build Coastguard Worker return nullptr; \
119*993b0882SAndroid Build Coastguard Worker } \
120*993b0882SAndroid Build Coastguard Worker }
121*993b0882SAndroid Build Coastguard Worker
122*993b0882SAndroid Build Coastguard Worker #define TC3_GET_STATIC_INT_FIELD(CLASS, FIELD, NAME) \
123*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN_NULL(const jfieldID CLASS##_##FIELD##_field, \
124*993b0882SAndroid Build Coastguard Worker JniHelper::GetStaticFieldID( \
125*993b0882SAndroid Build Coastguard Worker env, result->CLASS##_class.get(), NAME, "I")); \
126*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN_NULL( \
127*993b0882SAndroid Build Coastguard Worker result->CLASS##_##FIELD, \
128*993b0882SAndroid Build Coastguard Worker JniHelper::GetStaticIntField(env, result->CLASS##_class.get(), \
129*993b0882SAndroid Build Coastguard Worker CLASS##_##FIELD##_field));
130*993b0882SAndroid Build Coastguard Worker
Create(JNIEnv * env)131*993b0882SAndroid Build Coastguard Worker std::unique_ptr<JniCache> JniCache::Create(JNIEnv* env) {
132*993b0882SAndroid Build Coastguard Worker if (env == nullptr) {
133*993b0882SAndroid Build Coastguard Worker return nullptr;
134*993b0882SAndroid Build Coastguard Worker }
135*993b0882SAndroid Build Coastguard Worker JavaVM* jvm = nullptr;
136*993b0882SAndroid Build Coastguard Worker if (JNI_OK != env->GetJavaVM(&jvm) || jvm == nullptr) {
137*993b0882SAndroid Build Coastguard Worker return nullptr;
138*993b0882SAndroid Build Coastguard Worker }
139*993b0882SAndroid Build Coastguard Worker std::unique_ptr<JniCache> result(new JniCache(jvm));
140*993b0882SAndroid Build Coastguard Worker
141*993b0882SAndroid Build Coastguard Worker // String
142*993b0882SAndroid Build Coastguard Worker TC3_GET_CLASS_OR_RETURN_NULL(string, "java/lang/String");
143*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(string, init_bytes_charset, "<init>",
144*993b0882SAndroid Build Coastguard Worker "([BLjava/lang/String;)V");
145*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(string, code_point_count, "codePointCount", "(II)I");
146*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(string, length, "length", "()I");
147*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN_NULL(ScopedLocalRef<jstring> result_string,
148*993b0882SAndroid Build Coastguard Worker JniHelper::NewStringUTF(env, "UTF-8"));
149*993b0882SAndroid Build Coastguard Worker result->string_utf8 = MakeGlobalRef(result_string.get(), env, jvm);
150*993b0882SAndroid Build Coastguard Worker TC3_CHECK_JNI_PTR(result->string_utf8);
151*993b0882SAndroid Build Coastguard Worker
152*993b0882SAndroid Build Coastguard Worker // Pattern
153*993b0882SAndroid Build Coastguard Worker TC3_GET_CLASS_OR_RETURN_NULL(pattern, "java/util/regex/Pattern");
154*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_METHOD(pattern, compile, "compile",
155*993b0882SAndroid Build Coastguard Worker "(Ljava/lang/String;)Ljava/util/regex/Pattern;");
156*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(pattern, matcher, "matcher",
157*993b0882SAndroid Build Coastguard Worker "(Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;");
158*993b0882SAndroid Build Coastguard Worker
159*993b0882SAndroid Build Coastguard Worker // Matcher
160*993b0882SAndroid Build Coastguard Worker TC3_GET_CLASS_OR_RETURN_NULL(matcher, "java/util/regex/Matcher");
161*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(matcher, matches, "matches", "()Z");
162*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(matcher, find, "find", "()Z");
163*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(matcher, reset, "reset", "()Ljava/util/regex/Matcher;");
164*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(matcher, start_idx, "start", "(I)I");
165*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(matcher, end_idx, "end", "(I)I");
166*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(matcher, group, "group", "()Ljava/lang/String;");
167*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(matcher, group_idx, "group", "(I)Ljava/lang/String;");
168*993b0882SAndroid Build Coastguard Worker
169*993b0882SAndroid Build Coastguard Worker // Locale
170*993b0882SAndroid Build Coastguard Worker TC3_GET_CLASS_OR_RETURN_NULL(locale, "java/util/Locale");
171*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_OBJECT_FIELD_OR_RETURN_NULL(locale, us, "US",
172*993b0882SAndroid Build Coastguard Worker "Ljava/util/Locale;");
173*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(locale, init_string, "<init>", "(Ljava/lang/String;)V");
174*993b0882SAndroid Build Coastguard Worker TC3_GET_OPTIONAL_STATIC_METHOD(locale, for_language_tag, "forLanguageTag",
175*993b0882SAndroid Build Coastguard Worker "(Ljava/lang/String;)Ljava/util/Locale;");
176*993b0882SAndroid Build Coastguard Worker
177*993b0882SAndroid Build Coastguard Worker // BreakIterator
178*993b0882SAndroid Build Coastguard Worker TC3_GET_CLASS_OR_RETURN_NULL(breakiterator, "java/text/BreakIterator");
179*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_METHOD(breakiterator, getwordinstance, "getWordInstance",
180*993b0882SAndroid Build Coastguard Worker "(Ljava/util/Locale;)Ljava/text/BreakIterator;");
181*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(breakiterator, settext, "setText", "(Ljava/lang/String;)V");
182*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(breakiterator, next, "next", "()I");
183*993b0882SAndroid Build Coastguard Worker
184*993b0882SAndroid Build Coastguard Worker // Integer
185*993b0882SAndroid Build Coastguard Worker TC3_GET_CLASS_OR_RETURN_NULL(integer, "java/lang/Integer");
186*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_METHOD(integer, parse_int, "parseInt",
187*993b0882SAndroid Build Coastguard Worker "(Ljava/lang/String;)I");
188*993b0882SAndroid Build Coastguard Worker
189*993b0882SAndroid Build Coastguard Worker // Calendar.
190*993b0882SAndroid Build Coastguard Worker TC3_GET_CLASS_OR_RETURN_NULL(calendar, "java/util/Calendar");
191*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_METHOD(
192*993b0882SAndroid Build Coastguard Worker calendar, get_instance, "getInstance",
193*993b0882SAndroid Build Coastguard Worker "(Ljava/util/TimeZone;Ljava/util/Locale;)Ljava/util/Calendar;");
194*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(calendar, get_first_day_of_week, "getFirstDayOfWeek", "()I");
195*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(calendar, get_time_in_millis, "getTimeInMillis", "()J");
196*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(calendar, set_time_in_millis, "setTimeInMillis", "(J)V");
197*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(calendar, add, "add", "(II)V");
198*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(calendar, get, "get", "(I)I");
199*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(calendar, set, "set", "(II)V");
200*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_INT_FIELD(calendar, zone_offset, "ZONE_OFFSET");
201*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_INT_FIELD(calendar, dst_offset, "DST_OFFSET");
202*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_INT_FIELD(calendar, year, "YEAR");
203*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_INT_FIELD(calendar, month, "MONTH");
204*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_INT_FIELD(calendar, day_of_year, "DAY_OF_YEAR");
205*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_INT_FIELD(calendar, day_of_month, "DAY_OF_MONTH");
206*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_INT_FIELD(calendar, day_of_week, "DAY_OF_WEEK");
207*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_INT_FIELD(calendar, hour_of_day, "HOUR_OF_DAY");
208*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_INT_FIELD(calendar, minute, "MINUTE");
209*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_INT_FIELD(calendar, second, "SECOND");
210*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_INT_FIELD(calendar, millisecond, "MILLISECOND");
211*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_INT_FIELD(calendar, sunday, "SUNDAY");
212*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_INT_FIELD(calendar, monday, "MONDAY");
213*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_INT_FIELD(calendar, tuesday, "TUESDAY");
214*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_INT_FIELD(calendar, wednesday, "WEDNESDAY");
215*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_INT_FIELD(calendar, thursday, "THURSDAY");
216*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_INT_FIELD(calendar, friday, "FRIDAY");
217*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_INT_FIELD(calendar, saturday, "SATURDAY");
218*993b0882SAndroid Build Coastguard Worker
219*993b0882SAndroid Build Coastguard Worker // TimeZone.
220*993b0882SAndroid Build Coastguard Worker TC3_GET_CLASS_OR_RETURN_NULL(timezone, "java/util/TimeZone");
221*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_METHOD(timezone, get_timezone, "getTimeZone",
222*993b0882SAndroid Build Coastguard Worker "(Ljava/lang/String;)Ljava/util/TimeZone;");
223*993b0882SAndroid Build Coastguard Worker
224*993b0882SAndroid Build Coastguard Worker #ifdef __ANDROID__
225*993b0882SAndroid Build Coastguard Worker // Context.
226*993b0882SAndroid Build Coastguard Worker TC3_GET_CLASS_OR_RETURN_NULL(context, "android/content/Context");
227*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(context, get_package_name, "getPackageName",
228*993b0882SAndroid Build Coastguard Worker "()Ljava/lang/String;");
229*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(context, get_system_service, "getSystemService",
230*993b0882SAndroid Build Coastguard Worker "(Ljava/lang/String;)Ljava/lang/Object;");
231*993b0882SAndroid Build Coastguard Worker
232*993b0882SAndroid Build Coastguard Worker // Uri.
233*993b0882SAndroid Build Coastguard Worker TC3_GET_CLASS_OR_RETURN_NULL(uri, "android/net/Uri");
234*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_METHOD(uri, parse, "parse",
235*993b0882SAndroid Build Coastguard Worker "(Ljava/lang/String;)Landroid/net/Uri;");
236*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(uri, get_scheme, "getScheme", "()Ljava/lang/String;");
237*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(uri, get_host, "getHost", "()Ljava/lang/String;");
238*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_METHOD(uri, encode, "encode",
239*993b0882SAndroid Build Coastguard Worker "(Ljava/lang/String;)Ljava/lang/String;");
240*993b0882SAndroid Build Coastguard Worker
241*993b0882SAndroid Build Coastguard Worker // UserManager.
242*993b0882SAndroid Build Coastguard Worker TC3_GET_OPTIONAL_CLASS(usermanager, "android/os/UserManager");
243*993b0882SAndroid Build Coastguard Worker TC3_GET_OPTIONAL_METHOD(usermanager, get_user_restrictions,
244*993b0882SAndroid Build Coastguard Worker "getUserRestrictions", "()Landroid/os/Bundle;");
245*993b0882SAndroid Build Coastguard Worker
246*993b0882SAndroid Build Coastguard Worker // Bundle.
247*993b0882SAndroid Build Coastguard Worker TC3_GET_CLASS_OR_RETURN_NULL(bundle, "android/os/Bundle");
248*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(bundle, get_boolean, "getBoolean", "(Ljava/lang/String;)Z");
249*993b0882SAndroid Build Coastguard Worker
250*993b0882SAndroid Build Coastguard Worker // String resources.
251*993b0882SAndroid Build Coastguard Worker TC3_GET_CLASS_OR_RETURN_NULL(resources, "android/content/res/Resources");
252*993b0882SAndroid Build Coastguard Worker TC3_GET_STATIC_METHOD(resources, get_system, "getSystem",
253*993b0882SAndroid Build Coastguard Worker "()Landroid/content/res/Resources;");
254*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(resources, get_identifier, "getIdentifier",
255*993b0882SAndroid Build Coastguard Worker "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I");
256*993b0882SAndroid Build Coastguard Worker TC3_GET_METHOD(resources, get_string, "getString", "(I)Ljava/lang/String;");
257*993b0882SAndroid Build Coastguard Worker #endif
258*993b0882SAndroid Build Coastguard Worker
259*993b0882SAndroid Build Coastguard Worker return result;
260*993b0882SAndroid Build Coastguard Worker }
261*993b0882SAndroid Build Coastguard Worker
262*993b0882SAndroid Build Coastguard Worker #undef TC3_GET_STATIC_INT_FIELD
263*993b0882SAndroid Build Coastguard Worker #undef TC3_GET_STATIC_OBJECT_FIELD_OR_RETURN_NULL
264*993b0882SAndroid Build Coastguard Worker #undef TC3_GET_STATIC_METHOD
265*993b0882SAndroid Build Coastguard Worker #undef TC3_GET_METHOD
266*993b0882SAndroid Build Coastguard Worker #undef TC3_GET_CLASS_OR_RETURN_NULL
267*993b0882SAndroid Build Coastguard Worker #undef TC3_GET_OPTIONAL_CLASS
268*993b0882SAndroid Build Coastguard Worker #undef TC3_CHECK_JNI_PTR
269*993b0882SAndroid Build Coastguard Worker
GetEnv() const270*993b0882SAndroid Build Coastguard Worker JNIEnv* JniCache::GetEnv() const {
271*993b0882SAndroid Build Coastguard Worker void* env;
272*993b0882SAndroid Build Coastguard Worker if (JNI_OK == jvm->GetEnv(&env, JNI_VERSION_1_4)) {
273*993b0882SAndroid Build Coastguard Worker return reinterpret_cast<JNIEnv*>(env);
274*993b0882SAndroid Build Coastguard Worker } else {
275*993b0882SAndroid Build Coastguard Worker TC3_LOG(ERROR) << "JavaICU UniLib used on unattached thread";
276*993b0882SAndroid Build Coastguard Worker return nullptr;
277*993b0882SAndroid Build Coastguard Worker }
278*993b0882SAndroid Build Coastguard Worker }
279*993b0882SAndroid Build Coastguard Worker
ExceptionCheckAndClear() const280*993b0882SAndroid Build Coastguard Worker bool JniCache::ExceptionCheckAndClear() const {
281*993b0882SAndroid Build Coastguard Worker return JniExceptionCheckAndClear(GetEnv());
282*993b0882SAndroid Build Coastguard Worker }
283*993b0882SAndroid Build Coastguard Worker
ConvertToJavaString(const char * utf8_text,const int utf8_text_size_bytes) const284*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jstring>> JniCache::ConvertToJavaString(
285*993b0882SAndroid Build Coastguard Worker const char* utf8_text, const int utf8_text_size_bytes) const {
286*993b0882SAndroid Build Coastguard Worker // Create java byte array.
287*993b0882SAndroid Build Coastguard Worker JNIEnv* jenv = GetEnv();
288*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(ScopedLocalRef<jbyteArray> text_java_utf8,
289*993b0882SAndroid Build Coastguard Worker JniHelper::NewByteArray(jenv, utf8_text_size_bytes));
290*993b0882SAndroid Build Coastguard Worker
291*993b0882SAndroid Build Coastguard Worker TC3_RETURN_IF_ERROR(JniHelper::SetByteArrayRegion(
292*993b0882SAndroid Build Coastguard Worker jenv, text_java_utf8.get(), 0, utf8_text_size_bytes,
293*993b0882SAndroid Build Coastguard Worker reinterpret_cast<const jbyte*>(utf8_text)));
294*993b0882SAndroid Build Coastguard Worker
295*993b0882SAndroid Build Coastguard Worker // Create the string with a UTF-8 charset.
296*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(ScopedLocalRef<jstring> result,
297*993b0882SAndroid Build Coastguard Worker JniHelper::NewObject<jstring>(
298*993b0882SAndroid Build Coastguard Worker jenv, string_class.get(), string_init_bytes_charset,
299*993b0882SAndroid Build Coastguard Worker text_java_utf8.get(), string_utf8.get()));
300*993b0882SAndroid Build Coastguard Worker
301*993b0882SAndroid Build Coastguard Worker return result;
302*993b0882SAndroid Build Coastguard Worker }
303*993b0882SAndroid Build Coastguard Worker
ConvertToJavaString(StringPiece utf8_text) const304*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jstring>> JniCache::ConvertToJavaString(
305*993b0882SAndroid Build Coastguard Worker StringPiece utf8_text) const {
306*993b0882SAndroid Build Coastguard Worker return ConvertToJavaString(utf8_text.data(), utf8_text.size());
307*993b0882SAndroid Build Coastguard Worker }
308*993b0882SAndroid Build Coastguard Worker
ConvertToJavaString(const UnicodeText & text) const309*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jstring>> JniCache::ConvertToJavaString(
310*993b0882SAndroid Build Coastguard Worker const UnicodeText& text) const {
311*993b0882SAndroid Build Coastguard Worker return ConvertToJavaString(text.data(), text.size_bytes());
312*993b0882SAndroid Build Coastguard Worker }
313*993b0882SAndroid Build Coastguard Worker
314*993b0882SAndroid Build Coastguard Worker } // namespace libtextclassifier3
315