From 497f1b8993f9fed55fdb56522a059d8c6abe81e2 Mon Sep 17 00:00:00 2001 From: Roman Sedaikin Date: Thu, 14 Nov 2024 19:21:04 +0300 Subject: [PATCH] Fix vmloader Signed-off-by: Roman Sedaikin --- interop/src/cpp/vmloader.cc | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/interop/src/cpp/vmloader.cc b/interop/src/cpp/vmloader.cc index 207f5c6d9..195f0f205 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; } -- Gitee