xref: /aosp_15_r20/external/libtextclassifier/native/utils/java/jni-helper.cc (revision 993b0882672172b81d12fad7a7ac0c3e5c824a12)
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-helper.h"
18*993b0882SAndroid Build Coastguard Worker 
19*993b0882SAndroid Build Coastguard Worker #include "utils/base/status_macros.h"
20*993b0882SAndroid Build Coastguard Worker 
21*993b0882SAndroid Build Coastguard Worker namespace libtextclassifier3 {
22*993b0882SAndroid Build Coastguard Worker 
FindClass(JNIEnv * env,const char * class_name)23*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jclass>> JniHelper::FindClass(JNIEnv* env,
24*993b0882SAndroid Build Coastguard Worker                                                       const char* class_name) {
25*993b0882SAndroid Build Coastguard Worker   TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN;
26*993b0882SAndroid Build Coastguard Worker   ScopedLocalRef<jclass> result(env->FindClass(class_name), env);
27*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
28*993b0882SAndroid Build Coastguard Worker   TC3_NOT_NULL_OR_RETURN;
29*993b0882SAndroid Build Coastguard Worker   return result;
30*993b0882SAndroid Build Coastguard Worker }
31*993b0882SAndroid Build Coastguard Worker 
GetObjectClass(JNIEnv * env,jobject object)32*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jclass>> JniHelper::GetObjectClass(JNIEnv* env,
33*993b0882SAndroid Build Coastguard Worker                                                            jobject object) {
34*993b0882SAndroid Build Coastguard Worker   TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN;
35*993b0882SAndroid Build Coastguard Worker   ScopedLocalRef<jclass> result(env->GetObjectClass(object), env);
36*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
37*993b0882SAndroid Build Coastguard Worker   TC3_NOT_NULL_OR_RETURN;
38*993b0882SAndroid Build Coastguard Worker   return result;
39*993b0882SAndroid Build Coastguard Worker }
40*993b0882SAndroid Build Coastguard Worker 
GetMethodID(JNIEnv * env,jclass clazz,const char * method_name,const char * signature)41*993b0882SAndroid Build Coastguard Worker StatusOr<jmethodID> JniHelper::GetMethodID(JNIEnv* env, jclass clazz,
42*993b0882SAndroid Build Coastguard Worker                                            const char* method_name,
43*993b0882SAndroid Build Coastguard Worker                                            const char* signature) {
44*993b0882SAndroid Build Coastguard Worker   jmethodID result = env->GetMethodID(clazz, method_name, signature);
45*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
46*993b0882SAndroid Build Coastguard Worker   TC3_NOT_NULL_OR_RETURN;
47*993b0882SAndroid Build Coastguard Worker   return result;
48*993b0882SAndroid Build Coastguard Worker }
49*993b0882SAndroid Build Coastguard Worker 
GetStaticMethodID(JNIEnv * env,jclass clazz,const char * method_name,const char * signature)50*993b0882SAndroid Build Coastguard Worker StatusOr<jmethodID> JniHelper::GetStaticMethodID(JNIEnv* env, jclass clazz,
51*993b0882SAndroid Build Coastguard Worker                                                  const char* method_name,
52*993b0882SAndroid Build Coastguard Worker                                                  const char* signature) {
53*993b0882SAndroid Build Coastguard Worker   jmethodID result = env->GetStaticMethodID(clazz, method_name, signature);
54*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
55*993b0882SAndroid Build Coastguard Worker   TC3_NOT_NULL_OR_RETURN;
56*993b0882SAndroid Build Coastguard Worker   return result;
57*993b0882SAndroid Build Coastguard Worker }
58*993b0882SAndroid Build Coastguard Worker 
GetFieldID(JNIEnv * env,jclass clazz,const char * field_name,const char * signature)59*993b0882SAndroid Build Coastguard Worker StatusOr<jfieldID> JniHelper::GetFieldID(JNIEnv* env, jclass clazz,
60*993b0882SAndroid Build Coastguard Worker                                          const char* field_name,
61*993b0882SAndroid Build Coastguard Worker                                          const char* signature) {
62*993b0882SAndroid Build Coastguard Worker   jfieldID result = env->GetFieldID(clazz, field_name, signature);
63*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
64*993b0882SAndroid Build Coastguard Worker   TC3_NOT_NULL_OR_RETURN;
65*993b0882SAndroid Build Coastguard Worker   return result;
66*993b0882SAndroid Build Coastguard Worker }
67*993b0882SAndroid Build Coastguard Worker 
GetStaticFieldID(JNIEnv * env,jclass clazz,const char * field_name,const char * signature)68*993b0882SAndroid Build Coastguard Worker StatusOr<jfieldID> JniHelper::GetStaticFieldID(JNIEnv* env, jclass clazz,
69*993b0882SAndroid Build Coastguard Worker                                                const char* field_name,
70*993b0882SAndroid Build Coastguard Worker                                                const char* signature) {
71*993b0882SAndroid Build Coastguard Worker   jfieldID result = env->GetStaticFieldID(clazz, field_name, signature);
72*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
73*993b0882SAndroid Build Coastguard Worker   TC3_NOT_NULL_OR_RETURN;
74*993b0882SAndroid Build Coastguard Worker   return result;
75*993b0882SAndroid Build Coastguard Worker }
76*993b0882SAndroid Build Coastguard Worker 
GetStaticObjectField(JNIEnv * env,jclass class_name,jfieldID field_id)77*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jobject>> JniHelper::GetStaticObjectField(
78*993b0882SAndroid Build Coastguard Worker     JNIEnv* env, jclass class_name, jfieldID field_id) {
79*993b0882SAndroid Build Coastguard Worker   TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN;
80*993b0882SAndroid Build Coastguard Worker   ScopedLocalRef<jobject> result(
81*993b0882SAndroid Build Coastguard Worker       env->GetStaticObjectField(class_name, field_id), env);
82*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
83*993b0882SAndroid Build Coastguard Worker   TC3_NOT_NULL_OR_RETURN;
84*993b0882SAndroid Build Coastguard Worker   return result;
85*993b0882SAndroid Build Coastguard Worker }
86*993b0882SAndroid Build Coastguard Worker 
GetStaticIntField(JNIEnv * env,jclass class_name,jfieldID field_id)87*993b0882SAndroid Build Coastguard Worker StatusOr<jint> JniHelper::GetStaticIntField(JNIEnv* env, jclass class_name,
88*993b0882SAndroid Build Coastguard Worker                                             jfieldID field_id) {
89*993b0882SAndroid Build Coastguard Worker   TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN;
90*993b0882SAndroid Build Coastguard Worker   jint result = env->GetStaticIntField(class_name, field_id);
91*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
92*993b0882SAndroid Build Coastguard Worker   return result;
93*993b0882SAndroid Build Coastguard Worker }
94*993b0882SAndroid Build Coastguard Worker 
NewByteArray(JNIEnv * env,jsize length)95*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jbyteArray>> JniHelper::NewByteArray(JNIEnv* env,
96*993b0882SAndroid Build Coastguard Worker                                                              jsize length) {
97*993b0882SAndroid Build Coastguard Worker   TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN;
98*993b0882SAndroid Build Coastguard Worker   ScopedLocalRef<jbyteArray> result(env->NewByteArray(length), env);
99*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
100*993b0882SAndroid Build Coastguard Worker   TC3_NOT_NULL_OR_RETURN;
101*993b0882SAndroid Build Coastguard Worker   return result;
102*993b0882SAndroid Build Coastguard Worker }
103*993b0882SAndroid Build Coastguard Worker 
CallVoidMethod(JNIEnv * env,jobject object,jmethodID method_id,...)104*993b0882SAndroid Build Coastguard Worker Status JniHelper::CallVoidMethod(JNIEnv* env, jobject object,
105*993b0882SAndroid Build Coastguard Worker                                  jmethodID method_id, ...) {
106*993b0882SAndroid Build Coastguard Worker   va_list args;
107*993b0882SAndroid Build Coastguard Worker   va_start(args, method_id);
108*993b0882SAndroid Build Coastguard Worker   env->CallVoidMethodV(object, method_id, args);
109*993b0882SAndroid Build Coastguard Worker   va_end(args);
110*993b0882SAndroid Build Coastguard Worker 
111*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
112*993b0882SAndroid Build Coastguard Worker   return Status::OK;
113*993b0882SAndroid Build Coastguard Worker }
114*993b0882SAndroid Build Coastguard Worker 
CallBooleanMethod(JNIEnv * env,jobject object,jmethodID method_id,...)115*993b0882SAndroid Build Coastguard Worker StatusOr<bool> JniHelper::CallBooleanMethod(JNIEnv* env, jobject object,
116*993b0882SAndroid Build Coastguard Worker                                             jmethodID method_id, ...) {
117*993b0882SAndroid Build Coastguard Worker   va_list args;
118*993b0882SAndroid Build Coastguard Worker   va_start(args, method_id);
119*993b0882SAndroid Build Coastguard Worker   bool result = env->CallBooleanMethodV(object, method_id, args);
120*993b0882SAndroid Build Coastguard Worker   va_end(args);
121*993b0882SAndroid Build Coastguard Worker 
122*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
123*993b0882SAndroid Build Coastguard Worker   return result;
124*993b0882SAndroid Build Coastguard Worker }
125*993b0882SAndroid Build Coastguard Worker 
CallIntMethod(JNIEnv * env,jobject object,jmethodID method_id,...)126*993b0882SAndroid Build Coastguard Worker StatusOr<int32> JniHelper::CallIntMethod(JNIEnv* env, jobject object,
127*993b0882SAndroid Build Coastguard Worker                                          jmethodID method_id, ...) {
128*993b0882SAndroid Build Coastguard Worker   va_list args;
129*993b0882SAndroid Build Coastguard Worker   va_start(args, method_id);
130*993b0882SAndroid Build Coastguard Worker   jint result = env->CallIntMethodV(object, method_id, args);
131*993b0882SAndroid Build Coastguard Worker   va_end(args);
132*993b0882SAndroid Build Coastguard Worker 
133*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
134*993b0882SAndroid Build Coastguard Worker   return result;
135*993b0882SAndroid Build Coastguard Worker }
136*993b0882SAndroid Build Coastguard Worker 
CallLongMethod(JNIEnv * env,jobject object,jmethodID method_id,...)137*993b0882SAndroid Build Coastguard Worker StatusOr<int64> JniHelper::CallLongMethod(JNIEnv* env, jobject object,
138*993b0882SAndroid Build Coastguard Worker                                           jmethodID method_id, ...) {
139*993b0882SAndroid Build Coastguard Worker   va_list args;
140*993b0882SAndroid Build Coastguard Worker   va_start(args, method_id);
141*993b0882SAndroid Build Coastguard Worker   jlong result = env->CallLongMethodV(object, method_id, args);
142*993b0882SAndroid Build Coastguard Worker   va_end(args);
143*993b0882SAndroid Build Coastguard Worker 
144*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
145*993b0882SAndroid Build Coastguard Worker   return result;
146*993b0882SAndroid Build Coastguard Worker }
147*993b0882SAndroid Build Coastguard Worker 
CallFloatMethod(JNIEnv * env,jobject object,jmethodID method_id,...)148*993b0882SAndroid Build Coastguard Worker StatusOr<float> JniHelper::CallFloatMethod(JNIEnv* env, jobject object,
149*993b0882SAndroid Build Coastguard Worker                                            jmethodID method_id, ...) {
150*993b0882SAndroid Build Coastguard Worker   va_list args;
151*993b0882SAndroid Build Coastguard Worker   va_start(args, method_id);
152*993b0882SAndroid Build Coastguard Worker   jfloat result = env->CallFloatMethodV(object, method_id, args);
153*993b0882SAndroid Build Coastguard Worker   va_end(args);
154*993b0882SAndroid Build Coastguard Worker 
155*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
156*993b0882SAndroid Build Coastguard Worker   return result;
157*993b0882SAndroid Build Coastguard Worker }
158*993b0882SAndroid Build Coastguard Worker 
CallDoubleMethod(JNIEnv * env,jobject object,jmethodID method_id,...)159*993b0882SAndroid Build Coastguard Worker StatusOr<double> JniHelper::CallDoubleMethod(JNIEnv* env, jobject object,
160*993b0882SAndroid Build Coastguard Worker                                              jmethodID method_id, ...) {
161*993b0882SAndroid Build Coastguard Worker   va_list args;
162*993b0882SAndroid Build Coastguard Worker   va_start(args, method_id);
163*993b0882SAndroid Build Coastguard Worker   jdouble result = env->CallDoubleMethodV(object, method_id, args);
164*993b0882SAndroid Build Coastguard Worker   va_end(args);
165*993b0882SAndroid Build Coastguard Worker 
166*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
167*993b0882SAndroid Build Coastguard Worker   return result;
168*993b0882SAndroid Build Coastguard Worker }
169*993b0882SAndroid Build Coastguard Worker 
NewIntArray(JNIEnv * env,jsize length)170*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jintArray>> JniHelper::NewIntArray(JNIEnv* env,
171*993b0882SAndroid Build Coastguard Worker                                                            jsize length) {
172*993b0882SAndroid Build Coastguard Worker   TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN;
173*993b0882SAndroid Build Coastguard Worker   ScopedLocalRef<jintArray> result(env->NewIntArray(length), env);
174*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
175*993b0882SAndroid Build Coastguard Worker   TC3_NOT_NULL_OR_RETURN;
176*993b0882SAndroid Build Coastguard Worker   return result;
177*993b0882SAndroid Build Coastguard Worker }
178*993b0882SAndroid Build Coastguard Worker 
NewFloatArray(JNIEnv * env,jsize length)179*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jfloatArray>> JniHelper::NewFloatArray(JNIEnv* env,
180*993b0882SAndroid Build Coastguard Worker                                                                jsize length) {
181*993b0882SAndroid Build Coastguard Worker   TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN;
182*993b0882SAndroid Build Coastguard Worker   ScopedLocalRef<jfloatArray> result(env->NewFloatArray(length), env);
183*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
184*993b0882SAndroid Build Coastguard Worker   TC3_NOT_NULL_OR_RETURN;
185*993b0882SAndroid Build Coastguard Worker   return result;
186*993b0882SAndroid Build Coastguard Worker }
187*993b0882SAndroid Build Coastguard Worker 
SetObjectArrayElement(JNIEnv * env,jobjectArray array,jsize index,jobject val)188*993b0882SAndroid Build Coastguard Worker Status JniHelper::SetObjectArrayElement(JNIEnv* env, jobjectArray array,
189*993b0882SAndroid Build Coastguard Worker                                         jsize index, jobject val) {
190*993b0882SAndroid Build Coastguard Worker   TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN;
191*993b0882SAndroid Build Coastguard Worker   env->SetObjectArrayElement(array, index, val);
192*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
193*993b0882SAndroid Build Coastguard Worker   return Status::OK;
194*993b0882SAndroid Build Coastguard Worker }
195*993b0882SAndroid Build Coastguard Worker 
GetArrayLength(JNIEnv * env,jarray array)196*993b0882SAndroid Build Coastguard Worker StatusOr<jsize> JniHelper::GetArrayLength(JNIEnv* env, jarray array) {
197*993b0882SAndroid Build Coastguard Worker   TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN;
198*993b0882SAndroid Build Coastguard Worker   jsize result = env->GetArrayLength(array);
199*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
200*993b0882SAndroid Build Coastguard Worker   return result;
201*993b0882SAndroid Build Coastguard Worker }
202*993b0882SAndroid Build Coastguard Worker 
GetByteArrayRegion(JNIEnv * env,jbyteArray array,jsize start,jsize len,jbyte * buf)203*993b0882SAndroid Build Coastguard Worker Status JniHelper::GetByteArrayRegion(JNIEnv* env, jbyteArray array, jsize start,
204*993b0882SAndroid Build Coastguard Worker                                      jsize len, jbyte* buf) {
205*993b0882SAndroid Build Coastguard Worker   TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN;
206*993b0882SAndroid Build Coastguard Worker   env->GetByteArrayRegion(array, start, len, buf);
207*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
208*993b0882SAndroid Build Coastguard Worker   return Status::OK;
209*993b0882SAndroid Build Coastguard Worker }
210*993b0882SAndroid Build Coastguard Worker 
SetByteArrayRegion(JNIEnv * env,jbyteArray array,jsize start,jsize len,const jbyte * buf)211*993b0882SAndroid Build Coastguard Worker Status JniHelper::SetByteArrayRegion(JNIEnv* env, jbyteArray array, jsize start,
212*993b0882SAndroid Build Coastguard Worker                                      jsize len, const jbyte* buf) {
213*993b0882SAndroid Build Coastguard Worker   TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN;
214*993b0882SAndroid Build Coastguard Worker   env->SetByteArrayRegion(array, start, len, buf);
215*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
216*993b0882SAndroid Build Coastguard Worker   return Status::OK;
217*993b0882SAndroid Build Coastguard Worker }
218*993b0882SAndroid Build Coastguard Worker 
SetIntArrayRegion(JNIEnv * env,jintArray array,jsize start,jsize len,const jint * buf)219*993b0882SAndroid Build Coastguard Worker Status JniHelper::SetIntArrayRegion(JNIEnv* env, jintArray array, jsize start,
220*993b0882SAndroid Build Coastguard Worker                                     jsize len, const jint* buf) {
221*993b0882SAndroid Build Coastguard Worker   TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN;
222*993b0882SAndroid Build Coastguard Worker   env->SetIntArrayRegion(array, start, len, buf);
223*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
224*993b0882SAndroid Build Coastguard Worker   return Status::OK;
225*993b0882SAndroid Build Coastguard Worker }
226*993b0882SAndroid Build Coastguard Worker 
SetFloatArrayRegion(JNIEnv * env,jfloatArray array,jsize start,jsize len,const jfloat * buf)227*993b0882SAndroid Build Coastguard Worker Status JniHelper::SetFloatArrayRegion(JNIEnv* env, jfloatArray array,
228*993b0882SAndroid Build Coastguard Worker                                       jsize start, jsize len,
229*993b0882SAndroid Build Coastguard Worker                                       const jfloat* buf) {
230*993b0882SAndroid Build Coastguard Worker   TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN;
231*993b0882SAndroid Build Coastguard Worker   env->SetFloatArrayRegion(array, start, len, buf);
232*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
233*993b0882SAndroid Build Coastguard Worker   return Status::OK;
234*993b0882SAndroid Build Coastguard Worker }
235*993b0882SAndroid Build Coastguard Worker 
NewObjectArray(JNIEnv * env,jsize length,jclass element_class,jobject initial_element)236*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jobjectArray>> JniHelper::NewObjectArray(
237*993b0882SAndroid Build Coastguard Worker     JNIEnv* env, jsize length, jclass element_class, jobject initial_element) {
238*993b0882SAndroid Build Coastguard Worker   TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN;
239*993b0882SAndroid Build Coastguard Worker   ScopedLocalRef<jobjectArray> result(
240*993b0882SAndroid Build Coastguard Worker       env->NewObjectArray(length, element_class, initial_element), env);
241*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
242*993b0882SAndroid Build Coastguard Worker   TC3_NOT_NULL_OR_RETURN;
243*993b0882SAndroid Build Coastguard Worker   return result;
244*993b0882SAndroid Build Coastguard Worker }
245*993b0882SAndroid Build Coastguard Worker 
NewStringUTF(JNIEnv * env,const char * bytes)246*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jstring>> JniHelper::NewStringUTF(JNIEnv* env,
247*993b0882SAndroid Build Coastguard Worker                                                           const char* bytes) {
248*993b0882SAndroid Build Coastguard Worker   TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN;
249*993b0882SAndroid Build Coastguard Worker   ScopedLocalRef<jstring> result(env->NewStringUTF(bytes), env);
250*993b0882SAndroid Build Coastguard Worker   TC3_NO_EXCEPTION_OR_RETURN;
251*993b0882SAndroid Build Coastguard Worker   TC3_NOT_NULL_OR_RETURN;
252*993b0882SAndroid Build Coastguard Worker   return result;
253*993b0882SAndroid Build Coastguard Worker }
254*993b0882SAndroid Build Coastguard Worker 
JByteArrayToString(JNIEnv * env,jbyteArray array)255*993b0882SAndroid Build Coastguard Worker StatusOr<std::string> JByteArrayToString(JNIEnv* env, jbyteArray array) {
256*993b0882SAndroid Build Coastguard Worker   std::string result;
257*993b0882SAndroid Build Coastguard Worker   TC3_ASSIGN_OR_RETURN(const int array_length,
258*993b0882SAndroid Build Coastguard Worker                        JniHelper::GetArrayLength(env, array));
259*993b0882SAndroid Build Coastguard Worker   result.resize(array_length);
260*993b0882SAndroid Build Coastguard Worker   TC3_RETURN_IF_ERROR(JniHelper::GetByteArrayRegion(
261*993b0882SAndroid Build Coastguard Worker       env, array, 0, array_length,
262*993b0882SAndroid Build Coastguard Worker       reinterpret_cast<jbyte*>(const_cast<char*>(result.data()))));
263*993b0882SAndroid Build Coastguard Worker   return result;
264*993b0882SAndroid Build Coastguard Worker }
265*993b0882SAndroid Build Coastguard Worker 
JStringToUtf8String(JNIEnv * env,jstring jstr)266*993b0882SAndroid Build Coastguard Worker StatusOr<std::string> JStringToUtf8String(JNIEnv* env, jstring jstr) {
267*993b0882SAndroid Build Coastguard Worker   if (jstr == nullptr) {
268*993b0882SAndroid Build Coastguard Worker     return "";
269*993b0882SAndroid Build Coastguard Worker   }
270*993b0882SAndroid Build Coastguard Worker 
271*993b0882SAndroid Build Coastguard Worker   TC3_ASSIGN_OR_RETURN(ScopedLocalRef<jclass> string_class,
272*993b0882SAndroid Build Coastguard Worker                        JniHelper::FindClass(env, "java/lang/String"));
273*993b0882SAndroid Build Coastguard Worker   TC3_ASSIGN_OR_RETURN(
274*993b0882SAndroid Build Coastguard Worker       jmethodID get_bytes_id,
275*993b0882SAndroid Build Coastguard Worker       JniHelper::GetMethodID(env, string_class.get(), "getBytes",
276*993b0882SAndroid Build Coastguard Worker                              "(Ljava/lang/String;)[B"));
277*993b0882SAndroid Build Coastguard Worker 
278*993b0882SAndroid Build Coastguard Worker   TC3_ASSIGN_OR_RETURN(ScopedLocalRef<jstring> encoding,
279*993b0882SAndroid Build Coastguard Worker                        JniHelper::NewStringUTF(env, "UTF-8"));
280*993b0882SAndroid Build Coastguard Worker 
281*993b0882SAndroid Build Coastguard Worker   TC3_ASSIGN_OR_RETURN(ScopedLocalRef<jbyteArray> array,
282*993b0882SAndroid Build Coastguard Worker                        JniHelper::CallObjectMethod<jbyteArray>(
283*993b0882SAndroid Build Coastguard Worker                            env, jstr, get_bytes_id, encoding.get()));
284*993b0882SAndroid Build Coastguard Worker 
285*993b0882SAndroid Build Coastguard Worker   return JByteArrayToString(env, array.get());
286*993b0882SAndroid Build Coastguard Worker }
287*993b0882SAndroid Build Coastguard Worker 
288*993b0882SAndroid Build Coastguard Worker }  // namespace libtextclassifier3
289