#include "base/include/platform/android/scoped_java_ref.h"
#include <vector>
#include "base/include/platform/android/jni_utils.h"
namespace lynx {
namespace base {
namespace android {
static constexpr int32_t kDefaultLocalFrameCapacity = 16;
JavaRef<jobject>::JavaRef() = default;
JavaRef<jobject>::JavaRef(JNIEnv* env, jobject obj) : obj_(obj) {}
JNIEnv* JavaRef<jobject>::ResetNewLocalRef(JNIEnv* env, jobject obj) {
if (!env) {
env = AttachCurrentThread();
}
if (obj) {
obj = env->NewLocalRef(obj);
}
if (obj_) env->DeleteLocalRef(obj_);
obj_ = obj;
return env;
}
void JavaRef<jobject>::ReleaseLocalRef(JNIEnv* env) {
if (!obj_) {
return;
}
if (!env) {
env = AttachCurrentThread();
}
env->DeleteLocalRef(obj_);
obj_ = nullptr;
}
void JavaRef<jobject>::ResetNewGlobalRef(JNIEnv* env, jobject obj) {
if (!env) {
env = AttachCurrentThread();
}
if (obj) obj = env->NewGlobalRef(obj);
if (obj_) env->DeleteGlobalRef(obj_);
obj_ = obj;
}
void JavaRef<jobject>::ReleaseGlobalRef(JNIEnv* env) {
if (obj_ == nullptr) {
return;
}
if (!env) {
env = AttachCurrentThread();
}
if (!env) {
return;
}
env->DeleteGlobalRef(obj_);
obj_ = nullptr;
}
void JavaRef<jobject>::ResetNewWeakGlobalRef(JNIEnv* env, jobject obj) {
if (!env) {
env = AttachCurrentThread();
}
if (obj) obj = env->NewWeakGlobalRef(obj);
if (obj_) env->DeleteWeakGlobalRef(obj_);
obj_ = obj;
}
void JavaRef<jobject>::ReleaseWeakGlobalRef(JNIEnv* env) {
if (obj_ == nullptr) {
return;
}
if (!env) {
env = AttachCurrentThread();
}
env->DeleteWeakGlobalRef(obj_);
obj_ = nullptr;
}
ScopedJavaLocalFrame::ScopedJavaLocalFrame(JNIEnv* env) : env_(env) {
env_->PushLocalFrame(kDefaultLocalFrameCapacity);
}
ScopedJavaLocalFrame::ScopedJavaLocalFrame(JNIEnv* env, int capacity)
: env_(env) {
env_->PushLocalFrame(capacity);
}
ScopedJavaLocalFrame::~ScopedJavaLocalFrame() { env_->PopLocalFrame(nullptr); }
}
}
}