diff options
Diffstat (limited to 'tensorflow_lite_support/cc/utils/jni_utils.cc')
-rw-r--r-- | tensorflow_lite_support/cc/utils/jni_utils.cc | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/tensorflow_lite_support/cc/utils/jni_utils.cc b/tensorflow_lite_support/cc/utils/jni_utils.cc new file mode 100644 index 00000000..25cf3266 --- /dev/null +++ b/tensorflow_lite_support/cc/utils/jni_utils.cc @@ -0,0 +1,100 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +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 "tensorflow_lite_support/cc/utils/jni_utils.h" + +#include <string.h> + +namespace tflite { +namespace support { +namespace utils { + +std::string JStringToString(JNIEnv* env, jstring jstr) { + if (jstr == nullptr) { + return std::string(); + } + const char* cstring = env->GetStringUTFChars(jstr, nullptr); + std::string result(cstring); + env->ReleaseStringUTFChars(jstr, cstring); + return result; +} + +std::vector<std::string> StringListToVector(JNIEnv* env, jobject list_object) { + jobject j_iterator = env->CallObjectMethod( + list_object, env->GetMethodID(env->GetObjectClass(list_object), + "iterator", "()Ljava/util/Iterator;")); + std::vector<std::string> result; + jmethodID has_next = + env->GetMethodID(env->GetObjectClass(j_iterator), "hasNext", "()Z"); + jmethodID get_next = env->GetMethodID(env->GetObjectClass(j_iterator), "next", + "()Ljava/lang/Object;"); + while (env->CallBooleanMethod(j_iterator, has_next)) { + jstring jstr = + static_cast<jstring>(env->CallObjectMethod(j_iterator, get_next)); + const char* raw_str = env->GetStringUTFChars(jstr, JNI_FALSE); + result.emplace_back(std::string(raw_str)); + env->ReleaseStringUTFChars(jstr, raw_str); + } + return result; +} + +absl::string_view GetMappedFileBuffer(JNIEnv* env, const jobject& file_buffer) { + return absl::string_view( + static_cast<char*>(env->GetDirectBufferAddress(file_buffer)), + static_cast<size_t>(env->GetDirectBufferCapacity(file_buffer))); +} + +jbyteArray CreateByteArray(JNIEnv* env, const jbyte* data, int num_bytes) { + jbyteArray ret = env->NewByteArray(num_bytes); + env->SetByteArrayRegion(ret, 0, num_bytes, data); + + return ret; +} + +void ThrowException(JNIEnv* env, const char* clazz, const char* fmt, ...) { + va_list args; + va_start(args, fmt); + const size_t max_msg_len = 512; + auto* message = static_cast<char*>(malloc(max_msg_len)); + if (message && (vsnprintf(message, max_msg_len, fmt, args) >= 0)) { + ThrowExceptionWithMessage(env, clazz, message); + } else { + ThrowExceptionWithMessage(env, clazz, ""); + } + if (message) { + free(message); + } + va_end(args); +} + +void ThrowExceptionWithMessage(JNIEnv* env, const char* clazz, + const char* message) { + jclass e_class = env->FindClass(clazz); + if (strcmp(clazz, kAssertionError) == 0) { + // AssertionError cannot use ThrowNew in Java 7 + jmethodID constructor = + env->GetMethodID(e_class, "<init>", "(Ljava/lang/Object;)V"); + jstring jstr_message = env->NewStringUTF(message); + jobject e_object = env->NewObject(e_class, constructor, + static_cast<jobject>(jstr_message)); + env->Throw(static_cast<jthrowable>(e_object)); + return; + } + env->ThrowNew(e_class, message); +} + +} // namespace utils +} // namespace support +} // namespace tflite |