aboutsummaryrefslogtreecommitdiff
path: root/icing/jni/jni-cache.h
blob: 3faaed6d5a386252221af0a124148dbf52c3c5dc (plain)
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// Copyright (C) 2019 Google LLC
//
// 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.

#ifndef ICING_JNI_JNI_CACHE_H_
#define ICING_JNI_JNI_CACHE_H_

#ifndef ICING_REVERSE_JNI_SEGMENTATION
namespace icing {
namespace lib {

class JniCache {};  // Declare an empty class definition for non-Android builds.

}  // namespace lib
}  // namespace icing
#else  // ICING_REVERSE_JNI_SEGMENTATION

#include <jni.h>

#include "icing/text_classifier/lib3/utils/base/statusor.h"
#include "icing/text_classifier/lib3/utils/java/jni-base.h"

namespace icing {
namespace lib {

// A helper class to cache class and method pointers for calls from JNI to Java.
// (for implementations such as Java ICU that need to make calls from C++ to
// Java)
struct JniCache {
  static libtextclassifier3::StatusOr<std::unique_ptr<JniCache>> Create(
      JNIEnv* env);

  // Returns the correct JNIEnv of the current thread. This allows multiple
  // threads, each accessing the same instance of JniCache, to retrieve their
  // unique JNIEnv pointers.
  JNIEnv* GetEnv() const;

  // Returns true if there are any pending exceptions from the execution of JNI
  // calls. Also clears the exception if any existed.
  bool ExceptionCheckAndClear() const;

  JavaVM* jvm = nullptr;

  // java.lang.String
  libtextclassifier3::ScopedGlobalRef<jclass> string_class;
  jmethodID string_constructor = nullptr;
  jmethodID string_code_point_count = nullptr;
  jmethodID string_length = nullptr;
  libtextclassifier3::ScopedGlobalRef<jstring> string_utf8;

  // java.util.Locale
  libtextclassifier3::ScopedGlobalRef<jclass> locale_class;
  libtextclassifier3::ScopedGlobalRef<jobject> locale_us;
  jmethodID locale_constructor = nullptr;
  jmethodID locale_for_language_tag = nullptr;

  // BreakIteratorBatcher
  libtextclassifier3::ScopedGlobalRef<jclass> breakiterator_class;
  jmethodID breakiterator_constructor = nullptr;
  jmethodID breakiterator_settext = nullptr;
  jmethodID breakiterator_next = nullptr;
  jmethodID breakiterator_first = nullptr;
  jmethodID breakiterator_following = nullptr;
  jmethodID breakiterator_preceding = nullptr;

  // Helper to convert lib3 UnicodeText to Java strings.
  libtextclassifier3::StatusOr<libtextclassifier3::ScopedLocalRef<jstring>>
  ConvertToJavaString(const char* utf8_text,
                      const int utf8_text_size_bytes) const;

 private:
  explicit JniCache(JavaVM* jvm);
};

}  // namespace lib
}  // namespace icing

#endif  // !ICING_REVERSE_JNI_SEGMENTATION

#endif  // ICING_JNI_JNI_CACHE_H_