Skip to content

Commit 7c4f2d4

Browse files
committed
fix runtime currentObjectId scope to properly reset objectId
1 parent be2a487 commit 7c4f2d4

File tree

4 files changed

+613
-569
lines changed

4 files changed

+613
-569
lines changed

src/jni/CallbackHandlers.cpp

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ void CallbackHandlers::Init(Isolate *isolate, ObjectManager *objectManager)
3939
RESOLVE_CLASS_METHOD_ID = env.GetMethodID(RUNTIME_CLASS, "resolveClass", "(Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/Class;");
4040
assert(RESOLVE_CLASS_METHOD_ID != nullptr);
4141

42-
CURRENT_OBJECTID_FIELD_ID = env.GetStaticFieldID(RUNTIME_CLASS, "currentObjectId", "I");
42+
CURRENT_OBJECTID_FIELD_ID = env.GetFieldID(RUNTIME_CLASS, "currentObjectId", "I");
4343
assert(CURRENT_OBJECTID_FIELD_ID != nullptr);
4444

4545
MAKE_INSTANCE_STRONG_ID = env.GetMethodID(RUNTIME_CLASS, "makeInstanceStrong", "(Ljava/lang/Object;I)V");
@@ -85,25 +85,25 @@ bool CallbackHandlers::RegisterInstance(Isolate *isolate, const Local<Object>& j
8585

8686
jobject instance;
8787

88-
env.SetStaticIntField(RUNTIME_CLASS, CURRENT_OBJECTID_FIELD_ID, javaObjectID);
89-
90-
if(argWrapper.type == ArgType::Interface)
91-
{
92-
instance = env.NewObject(generatedJavaClass, mi.mid);
93-
}
94-
else
9588
{
96-
// resolve arguments before passing them on to the constructor
97-
JsArgConverter argConverter(argWrapper.args, mi.signature, argWrapper.outerThis);
98-
auto ctorArgs = argConverter.ToArgs();
89+
JavaObjectIdScope objIdScope(env, CURRENT_OBJECTID_FIELD_ID, runtime->GetJavaRuntime(), javaObjectID);
9990

100-
instance = env.NewObjectA(generatedJavaClass, mi.mid, ctorArgs);
91+
if(argWrapper.type == ArgType::Interface)
92+
{
93+
instance = env.NewObject(generatedJavaClass, mi.mid);
94+
}
95+
else
96+
{
97+
// resolve arguments before passing them on to the constructor
98+
JsArgConverter argConverter(argWrapper.args, mi.signature, argWrapper.outerThis);
99+
auto ctorArgs = argConverter.ToArgs();
100+
101+
instance = env.NewObjectA(generatedJavaClass, mi.mid, ctorArgs);
102+
}
101103
}
102104

103105
env.CallVoidMethod(runtime->GetJavaRuntime(), MAKE_INSTANCE_STRONG_ID, instance, javaObjectID);
104106

105-
env.SetStaticIntField(RUNTIME_CLASS, CURRENT_OBJECTID_FIELD_ID, -1);
106-
107107
AdjustAmountOfExternalAllocatedMemory(env, isolate);
108108

109109
JniLocalRef localInstance(instance);
@@ -137,14 +137,14 @@ jclass CallbackHandlers::ResolveClass(Isolate *isolate, const string& fullClassn
137137
{
138138
JEnv env;
139139

140-
//get needed arguments in order to load binding
140+
// get needed arguments in order to load binding
141141
JniLocalRef javaFullClassName(env.NewStringUTF(fullClassname.c_str()));
142142

143143
jobjectArray methodOverrides = GetMethodOverrides(env, implementationObject);
144144

145145
auto runtime = Runtime::GetRuntime(isolate);
146146

147-
//create or load generated binding (java class)
147+
// create or load generated binding (java class)
148148
JniLocalRef generatedClass(env.CallObjectMethod(runtime->GetJavaRuntime(), RESOLVE_CLASS_METHOD_ID, (jstring) javaFullClassName, methodOverrides));
149149
globalRefToGeneratedClass = static_cast<jclass>(env.NewGlobalRef(generatedClass));
150150

@@ -593,9 +593,9 @@ int64_t CallbackHandlers::AdjustAmountOfExternalAllocatedMemory(JEnv& env, Isola
593593
int64_t changeInBytes = env.CallLongMethod(runtime->GetJavaRuntime(), GET_CHANGE_IN_BYTES_OF_USED_MEMORY_METHOD_ID);
594594

595595
int64_t adjustedValue = (changeInBytes != 0)
596-
? isolate->AdjustAmountOfExternalAllocatedMemory(changeInBytes)
597-
:
598-
0;
596+
? isolate->AdjustAmountOfExternalAllocatedMemory(changeInBytes)
597+
:
598+
0;
599599

600600
return adjustedValue;
601601
}

src/jni/CallbackHandlers.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,25 @@ namespace tns
123123
static std::map<std::string, int> s_constructorCache;
124124

125125
static std::map<std::string, jclass> s_classCache;
126+
127+
struct JavaObjectIdScope
128+
{
129+
JavaObjectIdScope(JEnv& env, jfieldID fieldId, jobject runtime, int javaObjectId)
130+
: _env(env), _fieldID(fieldId), _runtime(runtime)
131+
{
132+
_env.SetIntField(_runtime, _fieldID, javaObjectId);
133+
}
134+
135+
~JavaObjectIdScope()
136+
{
137+
_env.SetIntField(_runtime, _fieldID, -1);
138+
}
139+
140+
private:
141+
JEnv _env;
142+
jfieldID _fieldID;
143+
jobject _runtime;
144+
};
126145
};
127146
}
128147

src/src/com/tns/Runtime.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ void passUncaughtExceptionToJs(Throwable ex, String stackTrace)
6565
private final java.lang.Runtime dalvikRuntime = java.lang.Runtime.getRuntime();
6666

6767
private final Object keyNotFoundObject = new Object();
68-
private static int currentObjectId = -1;
68+
private int currentObjectId = -1;
6969

7070
private ExtractPolicy extractPolicy;
7171

@@ -328,7 +328,7 @@ public static void initInstance(Object instance)
328328
{
329329
Runtime runtime = Runtime.getCurrentRuntime();
330330

331-
int objectId = Runtime.currentObjectId;
331+
int objectId = runtime.currentObjectId;
332332

333333
if (objectId != -1)
334334
{

0 commit comments

Comments
 (0)