Local<Object> ObjectManager::CreateJSWrapper(jint javaObjectID, const string& typeName, jobject instance) { JEnv env; JniLocalRef clazz(env.GetObjectClass(instance)); return CreateJSWrapperHelper(javaObjectID, typeName, clazz); }
string ObjectManager::GetClassName(jobject javaObject) { JEnv env; JniLocalRef objectClass(env.GetObjectClass(javaObject)); return GetClassName((jclass) objectClass); }
void NativePlatform::AppInitCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { try { auto isolate = Isolate::GetCurrent(); if (args.Length() != 1) { throw NativeScriptException(string("Application should be initialized with single parameter")); } if (!args[0]->IsObject()) { throw NativeScriptException(string("Application should be initialized with single object parameter containing overridden methods")); } // TODO: find another way to get "com/tns/NativeScriptApplication" metadata (move it to more appropriate place) auto node = MetadataNode::GetOrCreate("com/tns/NativeScriptApplication"); auto appInstance = node->CreateJSWrapper(isolate); DEBUG_WRITE("Application object created id: %d", appInstance->GetIdentityHash()); auto implementationObject = args[0]->ToObject(); implementationObject->SetHiddenValue(V8StringConstants::GetClassImplementationObject(), External::New(isolate, node)); DEBUG_WRITE("Application object implementation object is with id: %d", implementationObject->GetIdentityHash()); implementationObject->SetPrototype(appInstance->GetPrototype()); bool appSuccess = appInstance->SetPrototype(implementationObject); if (!appSuccess) { throw NativeScriptException(string("Application could not be initialized correctly")); } jweak applicationObject = g_objectManager->GetJavaObjectByID(AppJavaObjectID); JEnv env; jclass appClass = env.FindClass("com/tns/NativeScriptApplication"); g_objectManager->Link(appInstance, AppJavaObjectID, appClass); JniLocalRef applicationClass(env.GetObjectClass(applicationObject)); jmethodID setNativeScriptOverridesMethodId = env.GetMethodID((jclass)applicationClass, "setNativeScriptOverrides", "([Ljava/lang/String;)V"); jobjectArray methodOverrides = NativeScriptRuntime::GetMethodOverrides(env, implementationObject); env.CallVoidMethod(applicationObject, setNativeScriptOverridesMethodId, methodOverrides); } catch (NativeScriptException& e) { e.ReThrowToV8(); } catch (exception e) { DEBUG_WRITE("Error: c++ exception: %s", e.what()); } catch (...) { DEBUG_WRITE("Error: c++ exception!"); } }