Skip to content

Commit 8c62d23

Browse files
committed
fix: select correct runtime when calling from different threads and improve error message
1 parent 87bfa89 commit 8c62d23

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

test-app/runtime/src/main/cpp/ObjectManager.cpp

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,14 +105,26 @@ JniLocalRef ObjectManager::GetJavaObjectByJsObject(
105105
JSInstanceInfo* jsInstanceInfo = GetJSInstanceInfo(object);
106106

107107
if (jsInstanceInfo != nullptr) {
108+
auto existingJavaObject = GetJavaObjectByID(jsInstanceInfo->JavaObjectID);
109+
if (existingJavaObject == nullptr) {
110+
Env env;
111+
// provide a clearer exception message
112+
if (env.ExceptionCheck()) {
113+
env.ExceptionClear();
114+
auto className = GetClassName(jsInstanceInfo->ObjectClazz);
115+
NativeScriptException exception(
116+
"Failed to get Java object by ID. id=" +
117+
std::to_string(jsInstanceInfo->JavaObjectID) +
118+
", class=" + className);
119+
exception.ReThrowToJava();
120+
}
121+
}
108122
if (m_useGlobalRefs) {
109-
JniLocalRef javaObject(GetJavaObjectByID(jsInstanceInfo->JavaObjectID),
110-
true);
123+
JniLocalRef javaObject(existingJavaObject, true);
111124
return javaObject;
112125
} else {
113126
JEnv env;
114-
JniLocalRef javaObject(
115-
env.NewLocalRef(GetJavaObjectByID(jsInstanceInfo->JavaObjectID)));
127+
JniLocalRef javaObject(env.NewLocalRef(existingJavaObject));
116128
return javaObject;
117129
}
118130
}
@@ -173,6 +185,10 @@ jobject ObjectManager::GetJavaObjectByIDImpl(uint32_t javaObjectID) {
173185
JEnv env;
174186
jobject object = env.CallObjectMethod(
175187
m_javaRuntimeObject, GET_JAVAOBJECT_BY_ID_METHOD_ID, javaObjectID);
188+
// Leave as null since it's unhandled
189+
if (env.ExceptionCheck()) {
190+
return nullptr;
191+
}
176192
return object;
177193
}
178194

@@ -541,6 +557,11 @@ jweak ObjectManager::NewWeakGlobalRefCallback(const int& javaObjectID,
541557
void* state) {
542558
auto objManager = reinterpret_cast<ObjectManager*>(state);
543559

560+
auto javaObject = objManager->GetJavaObjectByIDImpl(javaObjectID);
561+
// failed to get object, return null weak ref
562+
if (javaObject == nullptr) {
563+
return nullptr;
564+
}
544565
JniLocalRef obj(objManager->GetJavaObjectByIDImpl(javaObjectID));
545566

546567
JEnv env;

test-app/runtime/src/main/java/com/tns/Runtime.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1246,7 +1246,8 @@ public static Object callJSMethodWithDelay(Object javaObject, String methodName,
12461246
public static Object callJSMethod(Object javaObject, String methodName, Class<?> retType, boolean isConstructor, long delay, Object... args) throws NativeScriptException {
12471247
Runtime runtime = Runtime.getCurrentRuntime();
12481248

1249-
if (runtime == null) {
1249+
// if we're not in a runtime or the runtime we're in does not have the object, try to find the right one (this might happen if a worker fires a JS method on an object created in the main thread or another worker)
1250+
if (runtime == null || runtime.getJavaObjectID(javaObject) == null) {
12501251
runtime = getObjectRuntime(javaObject);
12511252
}
12521253

0 commit comments

Comments
 (0)