diff options
author | Cassie Wang <cassiewang@google.com> | 2020-06-25 15:52:48 -0700 |
---|---|---|
committer | Cassie Wang <cassiewang@google.com> | 2020-06-25 16:44:56 -0700 |
commit | 09d66401215254a2bdfc134009039636054d28d2 (patch) | |
tree | cc3508f547c9e8167b06e3a8260cfafccbbda5aa /icing/text_classifier | |
parent | 42a60e1b4c64f439e85928123dff4a79d1ca1a2f (diff) | |
download | icing-09d66401215254a2bdfc134009039636054d28d2.tar.gz |
Pull upstream changes.
Change-Id: I8a1e76e3e42188364ac40c0c51efb1e49292c015
Diffstat (limited to 'icing/text_classifier')
-rw-r--r-- | icing/text_classifier/lib3/utils/base/status_macros.h | 13 | ||||
-rw-r--r-- | icing/text_classifier/lib3/utils/base/statusor.h | 24 | ||||
-rw-r--r-- | icing/text_classifier/lib3/utils/java/jni-base.cc | 9 | ||||
-rw-r--r-- | icing/text_classifier/lib3/utils/java/jni-base.h | 2 | ||||
-rw-r--r-- | icing/text_classifier/lib3/utils/java/jni-helper.cc | 122 | ||||
-rw-r--r-- | icing/text_classifier/lib3/utils/java/jni-helper.h | 34 | ||||
-rw-r--r-- | icing/text_classifier/lib3/utils/java/string_utils.cc | 73 | ||||
-rw-r--r-- | icing/text_classifier/lib3/utils/java/string_utils.h | 74 |
8 files changed, 172 insertions, 179 deletions
diff --git a/icing/text_classifier/lib3/utils/base/status_macros.h b/icing/text_classifier/lib3/utils/base/status_macros.h index 532691e..466e5b0 100644 --- a/icing/text_classifier/lib3/utils/base/status_macros.h +++ b/icing/text_classifier/lib3/utils/base/status_macros.h @@ -54,11 +54,20 @@ class StatusAdapter { // TC3_RETURN_IF_ERROR(foo.Method(args...)); // return libtextclassifier3::Status(); // } -#define TC3_RETURN_IF_ERROR(expr) \ +#define TC3_RETURN_IF_ERROR(expr) \ + TC3_RETURN_IF_ERROR_INTERNAL(expr, std::move(adapter).status()) + +#define TC3_RETURN_NULL_IF_ERROR(expr) \ + TC3_RETURN_IF_ERROR_INTERNAL(expr, nullptr) + +#define TC3_RETURN_FALSE_IF_ERROR(expr) \ + TC3_RETURN_IF_ERROR_INTERNAL(expr, false) + +#define TC3_RETURN_IF_ERROR_INTERNAL(expr, return_value) \ TC3_STATUS_MACROS_IMPL_ELSE_BLOCKER_ \ if (::libtextclassifier3::StatusAdapter adapter{expr}) { \ } else /* NOLINT */ \ - return std::move(adapter).status() + return return_value // The GNU compiler emits a warning for code like: // diff --git a/icing/text_classifier/lib3/utils/base/statusor.h b/icing/text_classifier/lib3/utils/base/statusor.h index 89c94e9..f5fae7a 100644 --- a/icing/text_classifier/lib3/utils/base/statusor.h +++ b/icing/text_classifier/lib3/utils/base/statusor.h @@ -32,7 +32,7 @@ class StatusOr { inline StatusOr(); // Builds from a non-OK status. Crashes if an OK status is specified. - inline StatusOr(const Status& status); // NOLINT + inline StatusOr(const Status& status); // NOLINT // Builds from the specified value. inline StatusOr(const T& value); // NOLINT @@ -257,7 +257,17 @@ inline StatusOr<T>& StatusOr<T>::operator=(const StatusOr<U>& other) { #define TC3_ASSIGN_OR_RETURN_FALSE(lhs, rexpr) \ TC3_ASSIGN_OR_RETURN(lhs, rexpr, false) -#define TC3_ASSIGN_OR_RETURN_0(lhs, rexpr) TC3_ASSIGN_OR_RETURN(lhs, rexpr, 0) +#define TC3_ASSIGN_OR_RETURN_0(...) \ + TC_STATUS_MACROS_IMPL_GET_VARIADIC_( \ + (__VA_ARGS__, TC_STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_0_3_, \ + TC_STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_0_2_)) \ + (__VA_ARGS__) + +#define TC_STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_0_2_(lhs, rexpr) \ + TC3_ASSIGN_OR_RETURN(lhs, rexpr, 0) +#define TC_STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_0_3_(lhs, rexpr, \ + log_expression) \ + TC3_ASSIGN_OR_RETURN(lhs, rexpr, (log_expression, 0)) // ================================================================= // == Implementation details, do not rely on anything below here. == @@ -279,11 +289,11 @@ constexpr bool HasPossiblyConditionalOperator(const char* lhs, int index) { #define TC_STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_2_(lhs, rexpr) \ TC_STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_3_(lhs, rexpr, _) -#define TC_STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_3_(lhs, rexpr, \ - error_expression) \ - TC_STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_( \ - TC_STATUS_MACROS_IMPL_CONCAT_(_status_or_value, __LINE__), lhs, rexpr, \ - error_expression) +#define TC_STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_3_(lhs, rexpr, \ + error_expression) \ + TC_STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_( \ + TC_STATUS_MACROS_IMPL_CONCAT_(_status_or_value, __COUNTER__), lhs, \ + rexpr, error_expression) #define TC_STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_(statusor, lhs, rexpr, \ error_expression) \ auto statusor = (rexpr); \ diff --git a/icing/text_classifier/lib3/utils/java/jni-base.cc b/icing/text_classifier/lib3/utils/java/jni-base.cc index 3b6d09e..897628c 100644 --- a/icing/text_classifier/lib3/utils/java/jni-base.cc +++ b/icing/text_classifier/lib3/utils/java/jni-base.cc @@ -15,7 +15,6 @@ #include "icing/text_classifier/lib3/utils/java/jni-base.h" #include "icing/text_classifier/lib3/utils/base/status.h" -#include "icing/text_classifier/lib3/utils/java/string_utils.h" namespace libtextclassifier3 { @@ -33,12 +32,4 @@ bool JniExceptionCheckAndClear(JNIEnv* env) { return result; } -StatusOr<std::string> ToStlString(JNIEnv* env, const jstring& str) { - std::string result; - if (!JStringToUtf8String(env, str, &result)) { - return {Status::UNKNOWN}; - } - return result; -} - } // namespace libtextclassifier3 diff --git a/icing/text_classifier/lib3/utils/java/jni-base.h b/icing/text_classifier/lib3/utils/java/jni-base.h index 7fd612a..5876eba 100644 --- a/icing/text_classifier/lib3/utils/java/jni-base.h +++ b/icing/text_classifier/lib3/utils/java/jni-base.h @@ -65,8 +65,6 @@ bool EnsureLocalCapacity(JNIEnv* env, int capacity); // Returns true if there was an exception. Also it clears the exception. bool JniExceptionCheckAndClear(JNIEnv* env); -StatusOr<std::string> ToStlString(JNIEnv* env, const jstring& str); - // A deleter to be used with std::unique_ptr to delete JNI global references. class GlobalRefDeleter { public: diff --git a/icing/text_classifier/lib3/utils/java/jni-helper.cc b/icing/text_classifier/lib3/utils/java/jni-helper.cc index 3f63a45..60a9dfb 100644 --- a/icing/text_classifier/lib3/utils/java/jni-helper.cc +++ b/icing/text_classifier/lib3/utils/java/jni-helper.cc @@ -14,6 +14,8 @@ #include "icing/text_classifier/lib3/utils/java/jni-helper.h" +#include "icing/text_classifier/lib3/utils/base/status_macros.h" + namespace libtextclassifier3 { StatusOr<ScopedLocalRef<jclass>> JniHelper::FindClass(JNIEnv* env, @@ -36,8 +38,35 @@ StatusOr<ScopedLocalRef<jclass>> JniHelper::GetObjectClass(JNIEnv* env, StatusOr<jmethodID> JniHelper::GetMethodID(JNIEnv* env, jclass clazz, const char* method_name, - const char* return_type) { - jmethodID result = env->GetMethodID(clazz, method_name, return_type); + const char* signature) { + jmethodID result = env->GetMethodID(clazz, method_name, signature); + TC3_NO_EXCEPTION_OR_RETURN; + TC3_NOT_NULL_OR_RETURN; + return result; +} + +StatusOr<jmethodID> JniHelper::GetStaticMethodID(JNIEnv* env, jclass clazz, + const char* method_name, + const char* signature) { + jmethodID result = env->GetStaticMethodID(clazz, method_name, signature); + TC3_NO_EXCEPTION_OR_RETURN; + TC3_NOT_NULL_OR_RETURN; + return result; +} + +StatusOr<jfieldID> JniHelper::GetFieldID(JNIEnv* env, jclass clazz, + const char* field_name, + const char* signature) { + jfieldID result = env->GetFieldID(clazz, field_name, signature); + TC3_NO_EXCEPTION_OR_RETURN; + TC3_NOT_NULL_OR_RETURN; + return result; +} + +StatusOr<jfieldID> JniHelper::GetStaticFieldID(JNIEnv* env, jclass clazz, + const char* field_name, + const char* signature) { + jfieldID result = env->GetStaticFieldID(clazz, field_name, signature); TC3_NO_EXCEPTION_OR_RETURN; TC3_NOT_NULL_OR_RETURN; return result; @@ -53,6 +82,14 @@ StatusOr<ScopedLocalRef<jobject>> JniHelper::GetStaticObjectField( return result; } +StatusOr<jint> JniHelper::GetStaticIntField(JNIEnv* env, jclass class_name, + jfieldID field_id) { + TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN; + jint result = env->GetStaticIntField(class_name, field_id); + TC3_NO_EXCEPTION_OR_RETURN; + return result; +} + StatusOr<ScopedLocalRef<jbyteArray>> JniHelper::NewByteArray(JNIEnv* env, jsize length) { TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN; @@ -154,21 +191,53 @@ Status JniHelper::SetObjectArrayElement(JNIEnv* env, jobjectArray array, return Status::OK; } -StatusOr<ScopedLocalRef<jobjectArray>> JniHelper::NewObjectArray( - JNIEnv* env, jsize length, jclass element_class, jobject initial_element) { +StatusOr<jsize> JniHelper::GetArrayLength(JNIEnv* env, jarray array) { TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN; - ScopedLocalRef<jobjectArray> result( - env->NewObjectArray(length, element_class, initial_element), env); + jsize result = env->GetArrayLength(array); TC3_NO_EXCEPTION_OR_RETURN; - TC3_NOT_NULL_OR_RETURN; return result; } -StatusOr<jsize> JniHelper::GetArrayLength(JNIEnv* env, - jarray jinput_fragments) { +Status JniHelper::GetByteArrayRegion(JNIEnv* env, jbyteArray array, jsize start, + jsize len, jbyte* buf) { + TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN; + env->GetByteArrayRegion(array, start, len, buf); + TC3_NO_EXCEPTION_OR_RETURN; + return Status::OK; +} + +Status JniHelper::SetByteArrayRegion(JNIEnv* env, jbyteArray array, jsize start, + jsize len, const jbyte* buf) { + TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN; + env->SetByteArrayRegion(array, start, len, buf); + TC3_NO_EXCEPTION_OR_RETURN; + return Status::OK; +} + +Status JniHelper::SetIntArrayRegion(JNIEnv* env, jintArray array, jsize start, + jsize len, const jint* buf) { + TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN; + env->SetIntArrayRegion(array, start, len, buf); + TC3_NO_EXCEPTION_OR_RETURN; + return Status::OK; +} + +Status JniHelper::SetFloatArrayRegion(JNIEnv* env, jfloatArray array, + jsize start, jsize len, + const jfloat* buf) { + TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN; + env->SetFloatArrayRegion(array, start, len, buf); + TC3_NO_EXCEPTION_OR_RETURN; + return Status::OK; +} + +StatusOr<ScopedLocalRef<jobjectArray>> JniHelper::NewObjectArray( + JNIEnv* env, jsize length, jclass element_class, jobject initial_element) { TC3_ENSURE_LOCAL_CAPACITY_OR_RETURN; - jsize result = env->GetArrayLength(jinput_fragments); + ScopedLocalRef<jobjectArray> result( + env->NewObjectArray(length, element_class, initial_element), env); TC3_NO_EXCEPTION_OR_RETURN; + TC3_NOT_NULL_OR_RETURN; return result; } @@ -181,4 +250,37 @@ StatusOr<ScopedLocalRef<jstring>> JniHelper::NewStringUTF(JNIEnv* env, return result; } +StatusOr<std::string> JByteArrayToString(JNIEnv* env, jbyteArray array) { + std::string result; + TC3_ASSIGN_OR_RETURN(const int array_length, + JniHelper::GetArrayLength(env, array)); + result.resize(array_length); + TC3_RETURN_IF_ERROR(JniHelper::GetByteArrayRegion( + env, array, 0, array_length, + reinterpret_cast<jbyte*>(const_cast<char*>(result.data())))); + return result; +} + +StatusOr<std::string> JStringToUtf8String(JNIEnv* env, jstring jstr) { + if (jstr == nullptr) { + return ""; + } + + TC3_ASSIGN_OR_RETURN(ScopedLocalRef<jclass> string_class, + JniHelper::FindClass(env, "java/lang/String")); + TC3_ASSIGN_OR_RETURN( + jmethodID get_bytes_id, + JniHelper::GetMethodID(env, string_class.get(), "getBytes", + "(Ljava/lang/String;)[B")); + + TC3_ASSIGN_OR_RETURN(ScopedLocalRef<jstring> encoding, + JniHelper::NewStringUTF(env, "UTF-8")); + + TC3_ASSIGN_OR_RETURN(ScopedLocalRef<jbyteArray> array, + JniHelper::CallObjectMethod<jbyteArray>( + env, jstr, get_bytes_id, encoding.get())); + + return JByteArrayToString(env, array.get()); +} + } // namespace libtextclassifier3 diff --git a/icing/text_classifier/lib3/utils/java/jni-helper.h b/icing/text_classifier/lib3/utils/java/jni-helper.h index fe989a0..907ad0d 100644 --- a/icing/text_classifier/lib3/utils/java/jni-helper.h +++ b/icing/text_classifier/lib3/utils/java/jni-helper.h @@ -81,10 +81,22 @@ class JniHelper { jsize index); static StatusOr<jmethodID> GetMethodID(JNIEnv* env, jclass clazz, const char* method_name, - const char* return_type); + const char* signature); + static StatusOr<jmethodID> GetStaticMethodID(JNIEnv* env, jclass clazz, + const char* method_name, + const char* signature); + + static StatusOr<jfieldID> GetFieldID(JNIEnv* env, jclass clazz, + const char* field_name, + const char* signature); + static StatusOr<jfieldID> GetStaticFieldID(JNIEnv* env, jclass clazz, + const char* field_name, + const char* signature); static StatusOr<ScopedLocalRef<jobject>> GetStaticObjectField( JNIEnv* env, jclass class_name, jfieldID field_id); + static StatusOr<jint> GetStaticIntField(JNIEnv* env, jclass class_name, + jfieldID field_id); // New* methods. TC3_DEFINE_VARIADIC_SCOPED_LOCAL_REF_ENV_METHOD(NewObject, jobject, jclass, @@ -101,11 +113,23 @@ class JniHelper { static StatusOr<ScopedLocalRef<jfloatArray>> NewFloatArray(JNIEnv* env, jsize length); - static StatusOr<jsize> GetArrayLength(JNIEnv* env, jarray jinput_fragments); + static StatusOr<jsize> GetArrayLength(JNIEnv* env, jarray array); static Status SetObjectArrayElement(JNIEnv* env, jobjectArray array, jsize index, jobject val); + static Status GetByteArrayRegion(JNIEnv* env, jbyteArray array, jsize start, + jsize len, jbyte* buf); + + static Status SetByteArrayRegion(JNIEnv* env, jbyteArray array, jsize start, + jsize len, const jbyte* buf); + + static Status SetIntArrayRegion(JNIEnv* env, jintArray array, jsize start, + jsize len, const jint* buf); + + static Status SetFloatArrayRegion(JNIEnv* env, jfloatArray array, jsize start, + jsize len, const jfloat* buf); + // Call* methods. TC3_DEFINE_VARIADIC_SCOPED_LOCAL_REF_ENV_METHOD(CallObjectMethod, jobject, jobject, TC3_JNI_NO_CHECK); @@ -154,6 +178,12 @@ StatusOr<T> JniHelper::CallStaticIntMethod(JNIEnv* env, jclass clazz, return result; } +// Converts Java byte[] object to std::string. +StatusOr<std::string> JByteArrayToString(JNIEnv* env, jbyteArray array); + +// Converts Java String object to UTF8-encoded std::string. +StatusOr<std::string> JStringToUtf8String(JNIEnv* env, jstring jstr); + } // namespace libtextclassifier3 #endif // ICING_TEXT_CLASSIFIER_LIB3_UTILS_JAVA_JNI_HELPER_H_ diff --git a/icing/text_classifier/lib3/utils/java/string_utils.cc b/icing/text_classifier/lib3/utils/java/string_utils.cc deleted file mode 100644 index 2384ba4..0000000 --- a/icing/text_classifier/lib3/utils/java/string_utils.cc +++ /dev/null @@ -1,73 +0,0 @@ -// 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. - -#include "icing/text_classifier/lib3/utils/java/string_utils.h" - -#include "icing/text_classifier/lib3/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 true; - } - - 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 diff --git a/icing/text_classifier/lib3/utils/java/string_utils.h b/icing/text_classifier/lib3/utils/java/string_utils.h deleted file mode 100644 index dddef57..0000000 --- a/icing/text_classifier/lib3/utils/java/string_utils.h +++ /dev/null @@ -1,74 +0,0 @@ -// 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_TEXT_CLASSIFIER_LIB3_UTILS_JAVA_STRING_UTILS_H_ -#define ICING_TEXT_CLASSIFIER_LIB3_UTILS_JAVA_STRING_UTILS_H_ - -#include <jni.h> -#include <memory> -#include <string> - -#include "icing/text_classifier/lib3/utils/base/logging.h" - -namespace libtextclassifier3 { - -bool JByteArrayToString(JNIEnv* env, const jbyteArray& array, - std::string* result); -bool JStringToUtf8String(JNIEnv* env, const jstring& jstr, std::string* result); - -// A deleter to be used with std::unique_ptr to release Java string chars. -class StringCharsReleaser { - public: - StringCharsReleaser() : env_(nullptr) {} - - StringCharsReleaser(JNIEnv* env, jstring jstr) : env_(env), jstr_(jstr) {} - - StringCharsReleaser(const StringCharsReleaser& orig) = default; - - // Copy assignment to allow move semantics in StringCharsReleaser. - StringCharsReleaser& operator=(const StringCharsReleaser& rhs) { - // As the releaser and its state are thread-local, it's enough to only - // ensure the envs are consistent but do nothing. - TC3_CHECK_EQ(env_, rhs.env_); - return *this; - } - - // The delete operator. - void operator()(const char* chars) const { - if (env_ != nullptr) { - env_->ReleaseStringUTFChars(jstr_, chars); - } - } - - private: - // The env_ stashed to use for deletion. Thread-local, don't share! - JNIEnv* const env_; - - // The referenced jstring. - jstring jstr_; -}; - -// A smart pointer that releases string chars when it goes out of scope. -// of scope. -// Note that this class is not thread-safe since it caches JNIEnv in -// the deleter. Do not use the same jobject across different threads. -using ScopedStringChars = std::unique_ptr<const char, StringCharsReleaser>; - -// Returns a scoped pointer to the array of Unicode characters of a string. -ScopedStringChars GetScopedStringChars(JNIEnv* env, jstring string, - jboolean* is_copy = nullptr); - -} // namespace libtextclassifier3 - -#endif // ICING_TEXT_CLASSIFIER_LIB3_UTILS_JAVA_STRING_UTILS_H_ |