diff --git a/interop/src/cpp/vmloader.cc b/interop/src/cpp/vmloader.cc index 207f5c6d919b12e660b8b85c9b23e2d915e3dc7b..195f0f205a1940d8694eb549d3eefc3607a88717 100644 --- a/interop/src/cpp/vmloader.cc +++ b/interop/src/cpp/vmloader.cc @@ -251,7 +251,7 @@ const AppInfo javaAppInfo = { "createApplication", "()Lorg/koalaui/arkoala/Application;", "start", - "()J" + "()J", "enter", "(II)Z", }; @@ -288,11 +288,29 @@ extern "C" DLL_EXPORT KNativePointer StartApplication() { if (g_vmEntry.vmKind == JAVA_VM_KIND) { JNIEnv* jEnv = (JNIEnv*)(g_vmEntry.env); jclass appClass = jEnv->FindClass(appInfo->className); - jmethodID start = jEnv->GetStaticMethodID(appClass, appInfo->startMethodName, appInfo->startMethodSig); - jobject app = jEnv->NewGlobalRef(jEnv->CallStaticObjectMethod(appClass, start)); + if (!appClass) { + fprintf(stderr, "Cannot load main class %s\n", appInfo->className); + return nullptr; + } + jmethodID create = jEnv->GetStaticMethodID(appClass, appInfo->createMethodName, appInfo->createMethodSig); + if (!create) { + fprintf(stderr, "Cannot find create method %s\n", appInfo->createMethodName); + return nullptr; + } + jobject app = jEnv->NewGlobalRef(jEnv->CallStaticObjectMethod(appClass, create)); g_vmEntry.app = (void*)app; + g_vmEntry.start = (void*)(jEnv->GetMethodID(appClass, appInfo->startMethodName, appInfo->startMethodSig)); + if (!g_vmEntry.start) { + fprintf(stderr, "Cannot find start method %s %s\n", appInfo->startMethodName,appInfo->startMethodSig); + return nullptr; + } g_vmEntry.enter = (void*)(jEnv->GetMethodID(appClass, appInfo->enterMethodName, appInfo->enterMethodSig)); - return 0; + if (!g_vmEntry.enter) { + fprintf(stderr, "Cannot find enter method %s %s\n", appInfo->enterMethodName,appInfo->enterMethodSig); + return nullptr; + } + auto result = reinterpret_cast(jEnv->CallLongMethod((jobject)(g_vmEntry.app), (jmethodID)(g_vmEntry.start))); + return result; } #endif #ifdef KOALA_ETS_NAPI @@ -313,8 +331,15 @@ extern "C" DLL_EXPORT KNativePointer StartApplication() { g_vmEntry.app = (void*)app; g_vmEntry.start = (void*)(etsEnv->Getp_method(appClass, appInfo->startMethodName, appInfo->startMethodSig)); - etsEnv->CallStaticObjectMethod(appClass, create); + if (!g_vmEntry.start) { + fprintf(stderr, "Cannot find create method %s\n", appInfo->startMethodName); + return nullptr; + } g_vmEntry.enter = (void*)(etsEnv->Getp_method(appClass, appInfo->enterMethodName, appInfo->enterMethodSig)); + if (!g_vmEntry.enter) { + fprintf(stderr, "Cannot find enter method %s\n", appInfo->enterMethodName); + return nullptr; + } auto result = reinterpret_cast(etsEnv->CallLongMethod((ets_object)(app), (ets_method)(g_vmEntry.start))); return result; }