lin
2025-07-30 fcd736bf35fd93b563e9bbf594f2aa7b62028cc9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
#include "utils/java/string_utils.h"
 
#include "utils/base/logging.h"
 
namespace libtextclassifier3 {
 
bool JByteArrayToString(JNIEnv* env, const jbyteArray& array,
                        std::string* result) {
  jbyte* const array_bytes = env->GetByteArrayElements(array, JNI_FALSE);
  if (array_bytes == nullptr) {
    return false;
  }
 
  const int array_length = env->GetArrayLength(array);
  *result = std::string(reinterpret_cast<char*>(array_bytes), array_length);
 
  env->ReleaseByteArrayElements(array, array_bytes, JNI_ABORT);
 
  return true;
}
 
bool JStringToUtf8String(JNIEnv* env, const jstring& jstr,
                         std::string* result) {
  if (jstr == nullptr) {
    *result = std::string();
    return false;
  }
 
  jclass string_class = env->FindClass("java/lang/String");
  if (!string_class) {
    TC3_LOG(ERROR) << "Can't find String class";
    return false;
  }
 
  jmethodID get_bytes_id =
      env->GetMethodID(string_class, "getBytes", "(Ljava/lang/String;)[B");
 
  jstring encoding = env->NewStringUTF("UTF-8");
 
  jbyteArray array = reinterpret_cast<jbyteArray>(
      env->CallObjectMethod(jstr, get_bytes_id, encoding));
 
  JByteArrayToString(env, array, result);
 
  // Release the array.
  env->DeleteLocalRef(array);
  env->DeleteLocalRef(string_class);
  env->DeleteLocalRef(encoding);
 
  return true;
}
 
ScopedStringChars GetScopedStringChars(JNIEnv* env, jstring string,
                                       jboolean* is_copy) {
  return ScopedStringChars(env->GetStringUTFChars(string, is_copy),
                           StringCharsReleaser(env, string));
}
 
}  // namespace libtextclassifier3