Skip to content

Commit e9165ce

Browse files
author
Mihail Slavchev
committed
use single JEnv instance in ObjectManager
1 parent 28f4e14 commit e9165ce

2 files changed

Lines changed: 33 additions & 54 deletions

File tree

src/jni/ObjectManager.cpp

Lines changed: 30 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -18,35 +18,33 @@ using namespace tns;
1818

1919
ObjectManager::ObjectManager()
2020
:
21-
m_numberOfGC(0), m_currentObjectId(0), m_cache(NewWeakGlobalRefCallback, DeleteWeakGlobalRefCallback, 1000, this)
21+
m_env(JEnv()), m_numberOfGC(0), m_currentObjectId(0), m_cache(NewWeakGlobalRefCallback, DeleteWeakGlobalRefCallback, 1000, this)
2222
{
23-
JEnv env;
24-
25-
PlatformClass = env.FindClass("com/tns/Platform");
23+
PlatformClass = m_env.FindClass("com/tns/Platform");
2624
assert(PlatformClass != nullptr);
2725

28-
GET_JAVAOBJECT_BY_ID_METHOD_ID = env.GetStaticMethodID(PlatformClass, "getJavaObjectByID", "(I)Ljava/lang/Object;");
26+
GET_JAVAOBJECT_BY_ID_METHOD_ID = m_env.GetStaticMethodID(PlatformClass, "getJavaObjectByID", "(I)Ljava/lang/Object;");
2927
assert(GET_JAVAOBJECT_BY_ID_METHOD_ID != nullptr);
3028

31-
GET_OR_CREATE_JAVA_OBJECT_ID_METHOD_ID = env.GetStaticMethodID(PlatformClass, "getOrCreateJavaObjectID", "(Ljava/lang/Object;)I");
29+
GET_OR_CREATE_JAVA_OBJECT_ID_METHOD_ID = m_env.GetStaticMethodID(PlatformClass, "getOrCreateJavaObjectID", "(Ljava/lang/Object;)I");
3230
assert(GET_OR_CREATE_JAVA_OBJECT_ID_METHOD_ID != nullptr);
3331

34-
MAKE_INSTANCE_WEAK_BATCH_METHOD_ID = env.GetStaticMethodID(PlatformClass, "makeInstanceWeak", "(Ljava/nio/ByteBuffer;IZ)V");
32+
MAKE_INSTANCE_WEAK_BATCH_METHOD_ID = m_env.GetStaticMethodID(PlatformClass, "makeInstanceWeak", "(Ljava/nio/ByteBuffer;IZ)V");
3533
assert(MAKE_INSTANCE_WEAK_BATCH_METHOD_ID != nullptr);
3634

37-
CHECK_WEAK_OBJECTS_ARE_ALIVE_METHOD_ID = env.GetStaticMethodID(PlatformClass, "checkWeakObjectAreAlive", "(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;I)V");
35+
CHECK_WEAK_OBJECTS_ARE_ALIVE_METHOD_ID = m_env.GetStaticMethodID(PlatformClass, "checkWeakObjectAreAlive", "(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;I)V");
3836
assert(CHECK_WEAK_OBJECTS_ARE_ALIVE_METHOD_ID != nullptr);
3937

40-
JAVA_LANG_CLASS = env.FindClass("java/lang/Class");
38+
JAVA_LANG_CLASS = m_env.FindClass("java/lang/Class");
4139
assert(JAVA_LANG_CLASS != nullptr);
4240

43-
GET_NAME_METHOD_ID = env.GetMethodID(JAVA_LANG_CLASS, "getName", "()Ljava/lang/String;");
41+
GET_NAME_METHOD_ID = m_env.GetMethodID(JAVA_LANG_CLASS, "getName", "()Ljava/lang/String;");
4442
assert(GET_NAME_METHOD_ID != nullptr);
4543

46-
auto useGlobalRefsMethodID = env.GetStaticMethodID(PlatformClass, "useGlobalRefs", "()Z");
44+
auto useGlobalRefsMethodID = m_env.GetStaticMethodID(PlatformClass, "useGlobalRefs", "()Z");
4745
assert(useGlobalRefsMethodID != nullptr);
4846

49-
auto useGlobalRefs = env.CallStaticBooleanMethod(PlatformClass, useGlobalRefsMethodID);
47+
auto useGlobalRefs = m_env.CallStaticBooleanMethod(PlatformClass, useGlobalRefsMethodID);
5048
m_useGlobalRefs = useGlobalRefs == JNI_TRUE;
5149

5250
ObjectManager::instance = this;
@@ -74,15 +72,14 @@ JniLocalRef ObjectManager::GetJavaObjectByJsObject(const Local<Object>& object)
7472

7573
if (jsInstanceInfo != nullptr)
7674
{
77-
JEnv env;
7875
if (m_useGlobalRefs)
7976
{
8077
JniLocalRef javaObject(GetJavaObjectByID(jsInstanceInfo->JavaObjectID), true);
8178
return javaObject;
8279
}
8380
else
8481
{
85-
JniLocalRef javaObject(env.NewLocalRef(GetJavaObjectByID(jsInstanceInfo->JavaObjectID)));
82+
JniLocalRef javaObject(m_env.NewLocalRef(GetJavaObjectByID(jsInstanceInfo->JavaObjectID)));
8683
return javaObject;
8784
}
8885
}
@@ -137,9 +134,9 @@ jweak ObjectManager::GetJavaObjectByID(uint32_t javaObjectID)
137134
return obj;
138135
}
139136

140-
jobject ObjectManager::GetJavaObjectByIDImpl(JEnv& env, uint32_t javaObjectID)
137+
jobject ObjectManager::GetJavaObjectByIDImpl(uint32_t javaObjectID)
141138
{
142-
jobject object = env.CallStaticObjectMethod(PlatformClass, GET_JAVAOBJECT_BY_ID_METHOD_ID, javaObjectID);
139+
jobject object = m_env.CallStaticObjectMethod(PlatformClass, GET_JAVAOBJECT_BY_ID_METHOD_ID, javaObjectID);
143140
return object;
144141
}
145142

@@ -168,9 +165,7 @@ void ObjectManager::SetJavaClass(const Local<Object>& instance, jclass clazz)
168165

169166
int ObjectManager::GetOrCreateObjectId(jobject object)
170167
{
171-
JEnv env;
172-
173-
jint javaObjectID = env.CallStaticIntMethod(PlatformClass, GET_OR_CREATE_JAVA_OBJECT_ID_METHOD_ID, object);
168+
jint javaObjectID = m_env.CallStaticIntMethod(PlatformClass, GET_OR_CREATE_JAVA_OBJECT_ID_METHOD_ID, object);
174169

175170
return javaObjectID;
176171
}
@@ -209,9 +204,7 @@ Local<Object> ObjectManager::CreateJSWrapper(jint javaObjectID, const string& ty
209204

210205
Local<Object> ObjectManager::CreateJSWrapper(jint javaObjectID, const string& typeName, jobject instance)
211206
{
212-
JEnv env;
213-
214-
JniLocalRef clazz(env.GetObjectClass(instance));
207+
JniLocalRef clazz(m_env.GetObjectClass(instance));
215208

216209
return CreateJSWrapperHelper(javaObjectID, typeName, clazz);
217210
}
@@ -228,8 +221,7 @@ Local<Object> ObjectManager::CreateJSWrapperHelper(jint javaObjectID, const stri
228221

229222
if (!jsWrapper.IsEmpty())
230223
{
231-
JEnv env;
232-
auto claz = env.FindClass(className);
224+
auto claz = m_env.FindClass(className);
233225
Link(jsWrapper, javaObjectID, claz);
234226
}
235227
return jsWrapper;
@@ -285,18 +277,14 @@ bool ObjectManager::CloneLink(const Local<Object>& src, const Local<Object>& des
285277

286278
string ObjectManager::GetClassName(jobject javaObject)
287279
{
288-
JEnv env;
289-
290-
JniLocalRef objectClass(env.GetObjectClass(javaObject));
280+
JniLocalRef objectClass(m_env.GetObjectClass(javaObject));
291281

292282
return GetClassName((jclass) objectClass);
293283
}
294284

295285
string ObjectManager::GetClassName(jclass clazz)
296286
{
297-
JEnv env;
298-
299-
JniLocalRef javaCanonicalName(env.CallObjectMethod(clazz, GET_NAME_METHOD_ID));
287+
JniLocalRef javaCanonicalName(m_env.CallObjectMethod(clazz, GET_NAME_METHOD_ID));
300288

301289
string className = ArgConverter::jstringToString(javaCanonicalName);
302290

@@ -339,8 +327,6 @@ void ObjectManager::JSObjectWeakCallback(Isolate *isolate, ObjectWeakCallbackSta
339327

340328
DEBUG_WRITE("JSObjectWeakCallback objectId: %d, hasImplObj=%d", javaObjectID, hasImplObj);
341329

342-
JEnv env;
343-
344330
if (hasImplObj)
345331
{
346332
if (jsInstanceInfo->IsJavaObjectWeak)
@@ -652,8 +638,6 @@ void ObjectManager::OnGcFinished(GCType type, GCCallbackFlags flags)
652638

653639
m_markedForGC.pop();
654640

655-
JEnv env;
656-
657641
if (m_markedForGC.empty())
658642
{
659643
MakeRegularObjectsWeak(m_released.m_IDs, m_buff);
@@ -673,8 +657,6 @@ void ObjectManager::OnGcFinished(GCType type, GCCallbackFlags flags)
673657

674658
void ObjectManager::MakeRegularObjectsWeak(const set<int>& instances, DirectBuffer& inputBuff)
675659
{
676-
JEnv env;
677-
678660
jboolean keepAsWeak = JNI_FALSE;
679661

680662
for (auto javaObjectId : instances)
@@ -684,7 +666,7 @@ void ObjectManager::MakeRegularObjectsWeak(const set<int>& instances, DirectBuff
684666
if (!success)
685667
{
686668
int length = inputBuff.Length();
687-
env.CallStaticVoidMethod(PlatformClass, MAKE_INSTANCE_WEAK_BATCH_METHOD_ID, (jobject) inputBuff, length, keepAsWeak);
669+
m_env.CallStaticVoidMethod(PlatformClass, MAKE_INSTANCE_WEAK_BATCH_METHOD_ID, (jobject) inputBuff, length, keepAsWeak);
688670
inputBuff.Reset();
689671
success = inputBuff.Write(javaObjectId);
690672
assert(success);
@@ -693,16 +675,14 @@ void ObjectManager::MakeRegularObjectsWeak(const set<int>& instances, DirectBuff
693675
int size = inputBuff.Size();
694676
if (size > 0)
695677
{
696-
env.CallStaticVoidMethod(PlatformClass, MAKE_INSTANCE_WEAK_BATCH_METHOD_ID, (jobject) inputBuff, size, keepAsWeak);
678+
m_env.CallStaticVoidMethod(PlatformClass, MAKE_INSTANCE_WEAK_BATCH_METHOD_ID, (jobject) inputBuff, size, keepAsWeak);
697679
}
698680

699681
inputBuff.Reset();
700682
}
701683

702684
void ObjectManager::MakeImplObjectsWeak(const vector<PersistentObjectIdPair>& instances, DirectBuffer& inputBuff)
703685
{
704-
JEnv env;
705-
706686
jboolean keepAsWeak = JNI_TRUE;
707687

708688
for (const auto& poIdPair : instances)
@@ -715,7 +695,7 @@ void ObjectManager::MakeImplObjectsWeak(const vector<PersistentObjectIdPair>& in
715695
{
716696
int length = inputBuff.Length();
717697
jboolean keepAsWeak = JNI_TRUE;
718-
env.CallStaticVoidMethod(PlatformClass, MAKE_INSTANCE_WEAK_BATCH_METHOD_ID, (jobject) inputBuff, length, keepAsWeak);
698+
m_env.CallStaticVoidMethod(PlatformClass, MAKE_INSTANCE_WEAK_BATCH_METHOD_ID, (jobject) inputBuff, length, keepAsWeak);
719699
inputBuff.Reset();
720700
success = inputBuff.Write(javaObjectId);
721701
assert(success);
@@ -725,16 +705,14 @@ void ObjectManager::MakeImplObjectsWeak(const vector<PersistentObjectIdPair>& in
725705
if (size > 0)
726706
{
727707
jboolean keepAsWeak = JNI_TRUE;
728-
env.CallStaticVoidMethod(PlatformClass, MAKE_INSTANCE_WEAK_BATCH_METHOD_ID, (jobject) inputBuff, size, keepAsWeak);
708+
m_env.CallStaticVoidMethod(PlatformClass, MAKE_INSTANCE_WEAK_BATCH_METHOD_ID, (jobject) inputBuff, size, keepAsWeak);
729709
}
730710

731711
inputBuff.Reset();
732712
}
733713

734714
void ObjectManager::CheckWeakObjectsAreAlive(const vector<PersistentObjectIdPair>& instances, DirectBuffer& inputBuff, DirectBuffer& outputBuff)
735715
{
736-
JEnv env;
737-
738716
for (const auto& poIdPair : instances)
739717
{
740718
int javaObjectId = poIdPair.javaObjectId;
@@ -744,7 +722,7 @@ void ObjectManager::CheckWeakObjectsAreAlive(const vector<PersistentObjectIdPair
744722
if (!success)
745723
{
746724
int length = inputBuff.Length();
747-
env.CallStaticVoidMethod(PlatformClass, CHECK_WEAK_OBJECTS_ARE_ALIVE_METHOD_ID, (jobject) inputBuff, (jobject) outputBuff, length);
725+
m_env.CallStaticVoidMethod(PlatformClass, CHECK_WEAK_OBJECTS_ARE_ALIVE_METHOD_ID, (jobject) inputBuff, (jobject) outputBuff, length);
748726
//
749727
int *released = outputBuff.GetData();
750728
for (int i = 0; i < length; i++)
@@ -766,7 +744,7 @@ void ObjectManager::CheckWeakObjectsAreAlive(const vector<PersistentObjectIdPair
766744
int size = inputBuff.Size();
767745
if (size > 0)
768746
{
769-
env.CallStaticVoidMethod(PlatformClass, CHECK_WEAK_OBJECTS_ARE_ALIVE_METHOD_ID, (jobject) inputBuff, (jobject) outputBuff, size);
747+
m_env.CallStaticVoidMethod(PlatformClass, CHECK_WEAK_OBJECTS_ARE_ALIVE_METHOD_ID, (jobject) inputBuff, (jobject) outputBuff, size);
770748
int *released = outputBuff.GetData();
771749
for (int i = 0; i < size; i++)
772750
{
@@ -784,21 +762,20 @@ void ObjectManager::CheckWeakObjectsAreAlive(const vector<PersistentObjectIdPair
784762

785763
jweak ObjectManager::NewWeakGlobalRefCallback(const int& javaObjectID, void *state)
786764
{
787-
ObjectManager *objManager = reinterpret_cast<ObjectManager*>(state);
788-
789-
JEnv env;
765+
auto objManager = reinterpret_cast<ObjectManager*>(state);
790766

791-
JniLocalRef obj(objManager->GetJavaObjectByIDImpl(env, javaObjectID));
767+
JniLocalRef obj(objManager->GetJavaObjectByIDImpl(javaObjectID));
792768

793-
jweak weakRef = env.NewWeakGlobalRef(obj);
769+
jweak weakRef = objManager->m_env.NewWeakGlobalRef(obj);
794770

795771
return weakRef;
796772
}
797773

798774
void ObjectManager::DeleteWeakGlobalRefCallback(const jweak& object, void *state)
799775
{
800-
JEnv env;
801-
env.DeleteWeakGlobalRef(object);
776+
auto objManager = reinterpret_cast<ObjectManager*>(state);
777+
778+
objManager->m_env.DeleteWeakGlobalRef(object);
802779
}
803780

804781
Local<Object> ObjectManager::GetEmptyObject(Isolate *isolate)

src/jni/ObjectManager.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ namespace tns
159159

160160
jweak GetJavaObjectByID(uint32_t javaObjectID);
161161

162-
jobject GetJavaObjectByIDImpl(JEnv& env, uint32_t javaObjectID);
162+
jobject GetJavaObjectByIDImpl(uint32_t javaObjectID);
163163

164164
static jweak NewWeakGlobalRefCallback(const int& javaObjectID, void *state);
165165

@@ -169,6 +169,8 @@ namespace tns
169169

170170
int m_numberOfGC;
171171

172+
JEnv m_env;
173+
172174
std::stack<GarbageCollectionInfo> m_markedForGC;
173175

174176
std::map<int, v8::Persistent<v8::Object>*> idToObject;

0 commit comments

Comments
 (0)