blob: 0f8a1c6b3c1f96102b241bfdaf0548fbf5230d19 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 <exception>
#include <stdexcept>
#include <string>
#include <jni/jni_common.h>
#include <jni/jni_error.h>
namespace local_engine
{
jclass CreateGlobalExceptionClassReference(JNIEnv * env, const char * class_name)
{
jclass local_class = env->FindClass(class_name);
jclass global_class = static_cast<jclass>(env->NewGlobalRef(local_class));
env->DeleteLocalRef(local_class);
if (global_class == nullptr)
{
std::string error_msg = "Unable to createGlobalClassReference for" + std::string(class_name);
throw std::runtime_error(error_msg);
}
return global_class;
}
jclass CreateGlobalClassReference(JNIEnv * env, const char * class_name)
{
jclass local_class = env->FindClass(class_name);
jclass global_class = static_cast<jclass>(env->NewGlobalRef(local_class));
env->DeleteLocalRef(local_class);
if (global_class == nullptr)
{
std::string error_message = "Unable to createGlobalClassReference for" + std::string(class_name);
env->ThrowNew(JniErrorsGlobalState::instance().getIllegalAccessExceptionClass(), error_message.c_str());
}
return global_class;
}
jmethodID GetMethodID(JNIEnv * env, jclass this_class, const char * name, const char * sig)
{
jmethodID ret = env->GetMethodID(this_class, name, sig);
if (ret == nullptr)
{
std::string error_message = "Unable to find method " + std::string(name) + " within signature" + std::string(sig);
env->ThrowNew(JniErrorsGlobalState::instance().getIllegalAccessExceptionClass(), error_message.c_str());
}
return ret;
}
jmethodID GetStaticMethodID(JNIEnv * env, jclass this_class, const char * name, const char * sig)
{
jmethodID ret = env->GetStaticMethodID(this_class, name, sig);
if (ret == nullptr)
{
std::string error_message = "Unable to find static method " + std::string(name) + " within signature" + std::string(sig);
env->ThrowNew(JniErrorsGlobalState::instance().getIllegalAccessExceptionClass(), error_message.c_str());
}
return ret;
}
jstring charTojstring(JNIEnv * env, const char * pat)
{
const jclass str_class = (env)->FindClass("Ljava/lang/String;");
const jmethodID ctor_id = (env)->GetMethodID(str_class, "<init>", "([BLjava/lang/String;)V");
const jsize str_size = static_cast<jsize>(strlen(pat));
const jbyteArray bytes = (env)->NewByteArray(str_size);
(env)->SetByteArrayRegion(bytes, 0, str_size, reinterpret_cast<jbyte *>(const_cast<char *>(pat)));
const jstring encoding = (env)->NewStringUTF("UTF-8");
const auto result = static_cast<jstring>((env)->NewObject(str_class, ctor_id, bytes, encoding));
env->DeleteLocalRef(bytes);
env->DeleteLocalRef(encoding);
return result;
}
jbyteArray stringTojbyteArray(JNIEnv * env, const std::string & str)
{
const auto * ptr = reinterpret_cast<const jbyte *>(str.c_str());
jsize strSize = static_cast<jsize>(str.size());
jbyteArray jarray = env->NewByteArray(strSize);
env->SetByteArrayRegion(jarray, 0, strSize, ptr);
return jarray;
}
JniEnvStatusWatcher & JniEnvStatusWatcher::instance()
{
static JniEnvStatusWatcher instance;
return instance;
}
JniMethodCallCounter & JniMethodCallCounter::instance()
{
static JniMethodCallCounter instance;
return instance;
}
JniMethodGuard::JniMethodGuard()
{
JniMethodCallCounter::instance().increment();
}
JniMethodGuard::~JniMethodGuard()
{
JniMethodCallCounter::instance().decrement();
}
bool JniMethodGuard::couldInvoke()
{
return JniEnvStatusWatcher::instance().isActive();
}
} // namespace local_engine