diff --git a/arkoala-arkts/arkui/src/Application.ts b/arkoala-arkts/arkui/src/Application.ts index 0107c25bcf38a9016818aa935a90981af3422a78..1c77d66643be58d8247564397083db53aa8b190a 100644 --- a/arkoala-arkts/arkui/src/Application.ts +++ b/arkoala-arkts/arkui/src/Application.ts @@ -14,7 +14,7 @@ */ import { ComputableState, IncrementalNode, GlobalStateManager, StateManager, StateContext, memoEntry, MutableState, createAnimationTimer, callScheduledCallbacks, scheduleCallback } from "@koalaui/runtime" -import { int32, int64, scheduleCoroutine, memoryStats } from "@koalaui/common" +import { int32, int64, scheduleCoroutine } from "@koalaui/common" import { pointer, nullptr, KPointer, InteropNativeModule, registerNativeModuleLibraryName } from "@koalaui/interop" import { PeerNode } from "./PeerNode" import { ArkUINativeModule } from "#components" diff --git a/arkoala-arkts/arkui/src/ComponentBase.ts b/arkoala-arkts/arkui/src/ComponentBase.ts index eccbd9749941c32811bcbd62da943a4421a07d75..14b878f91101d796681f3b8186cda56cdf7d201c 100644 --- a/arkoala-arkts/arkui/src/ComponentBase.ts +++ b/arkoala-arkts/arkui/src/ComponentBase.ts @@ -31,14 +31,13 @@ export class ComponentBase { ArkUINativeModule._ApplyModifierFinish(this.peer!.peer.ptr) } public animationStart(param: AnimateParam): this { - _animationStart(param, this.isFirstBuild); + _animationStart(param, this.isFirstBuild) return this } - public animationEnd(): this { _animationEnd(this.isFirstBuild, () => { - this.isFirstBuild = false; + this.isFirstBuild = false; }) - return this; + return this } } diff --git a/arkoala-arkts/arkui/src/UserView.ts b/arkoala-arkts/arkui/src/UserView.ts index 7ccc1a4707239da0258133f9b47d2f49bc0a765b..90c686df611fbee77af31327c5e7d7e8a0b9dcc7 100644 --- a/arkoala-arkts/arkui/src/UserView.ts +++ b/arkoala-arkts/arkui/src/UserView.ts @@ -15,7 +15,6 @@ import { InteropNativeModule } from "@koalaui/interop" import { int32, int8Array } from "@koalaui/common" - export type UserViewBuilder = /** @memo */ (/*root: PeerNode*/) => void diff --git a/arkoala-arkts/loader/src/loader.ts b/arkoala-arkts/loader/src/loader.ts index f66b0a9775d09a10bf5c11fe79d032e68ed46984..e4f01be1b6d7c1182851ed649dc31822cc868008 100644 --- a/arkoala-arkts/loader/src/loader.ts +++ b/arkoala-arkts/loader/src/loader.ts @@ -139,6 +139,12 @@ export function checkLoader(variant: string, app: string, params: string, loopIt vmKind = 2 break } + case 'panda-ani': { + vmKind = 4 + classPath = __dirname + "/../out/arkts-subset/abc" + nativePath = __dirname + "/../native" + break + } default: throw new Error(`${variant} is not known`) } diff --git a/interop/src/cpp/ani/ani.h b/interop/src/cpp/ani/ani.h index 3adbe2416edaed1a128b33be9cfd365c2c40eff1..e6a175fd3b33afcfadbf3c6c392a42ecf0c1f285 100644 --- a/interop/src/cpp/ani/ani.h +++ b/interop/src/cpp/ani/ani.h @@ -36,7 +36,7 @@ typedef size_t ani_size; // Primitive types: typedef uint8_t ani_boolean; -typedef uint32_t ani_char; +typedef uint16_t ani_char; // NOTE: Change by uint32_t when #22672 is resolved. typedef int8_t ani_byte; typedef int16_t ani_short; typedef int32_t ani_int; @@ -128,9 +128,6 @@ typedef ani_fixedarray ani_fixedarray_double; typedef ani_fixedarray ani_fixedarray_ref; #endif // __cplusplus -struct __ani_gref; -typedef struct __ani_gref *ani_gref; - struct __ani_wref; typedef struct __ani_wref *ani_wref; @@ -204,6 +201,7 @@ typedef enum { ANI_INVALID_ARGS, ANI_INVALID_TYPE, ANI_INVALID_DESCRIPTOR, + ANI_INCORRECT_REF, ANI_PENDING_ERROR, ANI_NOT_FOUND, ANI_ALREADY_BINDED, @@ -6258,7 +6256,7 @@ struct __ani_interaction_api { * @param[out] result A pointer to store the created global reference. * @return Returns a status code of type `ani_status` indicating success or failure. */ - ani_status (*GlobalReference_Create)(ani_env *env, ani_ref ref, ani_gref *result); + ani_status (*GlobalReference_Create)(ani_env *env, ani_ref ref, ani_ref *result); /** * @brief Deletes a global reference. @@ -6269,7 +6267,7 @@ struct __ani_interaction_api { * @param[in] gref The global reference to delete. * @return Returns a status code of type `ani_status` indicating success or failure. */ - ani_status (*GlobalReference_Delete)(ani_env *env, ani_gref gref); + ani_status (*GlobalReference_Delete)(ani_env *env, ani_ref gref); /** * @brief Creates a weak reference. @@ -6301,10 +6299,12 @@ struct __ani_interaction_api { * * @param[in] env A pointer to the environment structure. * @param[in] wref The weak reference to query. - * @param[out] result A pointer to store the retrieved local reference. + * @param[out] was_released_result A pointer to boolean flag which indicates that wref is GC collected. + * @param[out] ref_result A pointer to store the retrieved local reference. * @return Returns a status code of type `ani_status` indicating success or failure. */ - ani_status (*WeakReference_GetReference)(ani_env *env, ani_wref wref, ani_ref *result); + ani_status (*WeakReference_GetReference)(ani_env *env, ani_wref wref, ani_boolean *was_released_result, + ani_ref *ref_result); /** * @brief Creates a new array buffer. @@ -8868,11 +8868,11 @@ struct __ani_env { { return c_api->TupleValue_SetItem_Ref(this, tuple_value, index, value); } - ani_status GlobalReference_Create(ani_ref ref, ani_gref *result) + ani_status GlobalReference_Create(ani_ref ref, ani_ref *result) { return c_api->GlobalReference_Create(this, ref, result); } - ani_status GlobalReference_Delete(ani_gref ref) + ani_status GlobalReference_Delete(ani_ref ref) { return c_api->GlobalReference_Delete(this, ref); } @@ -8884,9 +8884,9 @@ struct __ani_env { { return c_api->WeakReference_Delete(this, wref); } - ani_status WeakReference_GetReference(ani_wref wref, ani_ref *result) + ani_status WeakReference_GetReference(ani_wref wref, ani_boolean *was_released_result, ani_ref *ref_result) { - return c_api->WeakReference_GetReference(this, wref, result); + return c_api->WeakReference_GetReference(this, wref, was_released_result, ref_result); } ani_status CreateArrayBuffer(size_t length, void **data_result, ani_arraybuffer *arraybuffer_result) { diff --git a/interop/src/cpp/ani/convertors-ani.cc b/interop/src/cpp/ani/convertors-ani.cc index aff874bdd5a6b495504009b5ab84b700febc387a..71f9491512ba3edd7f144c27f515876ed511465c 100644 --- a/interop/src/cpp/ani/convertors-ani.cc +++ b/interop/src/cpp/ani/convertors-ani.cc @@ -12,6 +12,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include +#include #include #include "convertors-ani.h" @@ -22,8 +24,6 @@ static const char* callCallbackFromNative = "callCallbackFromNative"; static const char* callCallbackFromNativeSig = "I[BI:I"; -static const char* FAST_NATIVE_PREFIX = "#F$"; - const bool registerByOne = true; static bool registerNatives(ani_env *env, const ani_class clazz, const std::vector> impls) { @@ -34,13 +34,13 @@ static bool registerNatives(ani_env *env, const ani_class clazz, const std::vect ani_native_function method; method.name = name.c_str(); method.pointer = func; - method.signature = (flag & ANI_SLOW_NATIVE_FLAG) == 0 ? FAST_NATIVE_PREFIX : nullptr; + method.signature = nullptr; if (registerByOne) { result &= env->Class_BindNativeMethods(clazz, &method, 1) == ANI_OK; ani_boolean isError = false; env->ExistUnhandledError(&isError); if (isError) { - //env->ErrorDescribe(); + env->DescribeError(); env->ResetError(); } } @@ -54,44 +54,46 @@ static bool registerNatives(ani_env *env, const ani_class clazz, const std::vect return registerByOne ? true : result; } -bool registerAllModules(ani_env *env) { +bool registerAllModules(ani_env *aniEnv) { auto moduleNames = AniExports::getInstance()->getModules(); - for (auto it = moduleNames.begin(); it != moduleNames.end(); ++it) { std::string classpath = AniExports::getInstance()->getClasspath(*it); ani_class nativeModule = nullptr; - env->FindClass(classpath.c_str(), &nativeModule); + aniEnv->FindClass(classpath.c_str(), &nativeModule); if (nativeModule == nullptr) { LOGE("Cannot find managed class %s", classpath.c_str()); continue; } - if (!registerNatives(env, nativeModule, AniExports::getInstance()->getMethods(*it))) { + if (!registerNatives(aniEnv, nativeModule, AniExports::getInstance()->getMethods(*it))) { return false; } } - return true; } -#if 0 -extern "C" ETS_EXPORT ets_int ETS_CALL EtsNapiOnLoad(ets_env *env) { - if (!registerAllModules(env)) { - LOGE("Failed to register ets modules"); - return ETS_ERR; +ANI_EXPORT ani_status ANI_Constructor(ani_vm *vm, uint32_t *result) { + ani_env* aniEnv = nullptr; + *result = 1; + vm->GetEnv(/* version */ 1, (ani_env**)&aniEnv); + if (!registerAllModules(aniEnv)) { + LOGE("Failed to register ANI modules"); + return ANI_ERROR; } auto interopClasspath = AniExports::getInstance()->getClasspath("InteropNativeModule"); - auto interopClass = env->FindClass(interopClasspath.c_str()); + ani_class interopClass = nullptr; + aniEnv->FindClass(interopClasspath.c_str(), &interopClass); if (interopClass == nullptr) { LOGE("Can not find InteropNativeModule classpath to set callback dispatcher"); - return ETS_ERR; + return ANI_ERROR; } +#if 0 if (!setKoalaEtsNapiCallbackDispatcher(env, interopClass, callCallbackFromNative, callCallbackFromNativeSig)) { LOGE("Failed to set koala ets callback dispatcher"); - return ETS_ERR; + return ANI_ERROR; } - return ETS_NAPI_VERSION_1_0; -} #endif + return ANI_OK; +} AniExports* AniExports::getInstance() { static AniExports *instance = nullptr; @@ -135,12 +137,13 @@ void AniExports::setClasspath(const char* module, const char *classpath) { } static std::map g_defaultClasspaths = { - {"InteropNativeModule", "@koalaui/interop/InteropNativeModule/InteropNativeModule"}, + {"InteropNativeModule", "L@koalaui/interop/InteropNativeModule/InteropNativeModule;"}, // todo leave just InteropNativeModule, define others via KOALA_ETS_INTEROP_MODULE_CLASSPATH - {"TestNativeModule", "@koalaui/arkts-arkui/generated/arkts/TestNativeModule/TestNativeModule"}, - {"ArkUINativeModule", "@koalaui/arkts-arkui/generated/arkts/ArkUINativeModule/ArkUINativeModule"}, - {"ArkUIGeneratedNativeModule", "@koalaui/arkts-arkui/generated/arkts/ArkUIGeneratedNativeModule/ArkUIGeneratedNativeModule"}, + {"TestNativeModule", "L@koalaui/arkts-arkui/generated/arkts/TestNativeModule/TestNativeModule;"}, + {"ArkUINativeModule", "L@koalaui/arkts-arkui/generated/arkts/ArkUINativeModule/ArkUINativeModule;"}, + {"ArkUIGeneratedNativeModule", "L@koalaui/arkts-arkui/generated/arkts/ArkUIGeneratedNativeModule/ArkUIGeneratedNativeModule;"}, }; + const std::string& AniExports::getClasspath(const std::string& module) { auto it = classpaths.find(module); if (it != classpaths.end()) { diff --git a/interop/src/cpp/ani/convertors-ani.h b/interop/src/cpp/ani/convertors-ani.h index 05c27dcecf713b473396ee75cc0e9f0542520028..ae51c25cf813a13ec3ea32cb82ac0f22ea9bf73a 100644 --- a/interop/src/cpp/ani/convertors-ani.h +++ b/interop/src/cpp/ani/convertors-ani.h @@ -29,11 +29,124 @@ template struct InteropTypeConverter { using InteropType = T; - static T convertFrom(ani_env* env, InteropType value) { return value; } - static InteropType convertTo(ani_env* env, T value) { return value; } + static T convertFrom(ani_env* env, InteropType value) = delete; + static InteropType convertTo(ani_env* env, T value) = delete; static void release(ani_env* env, InteropType value, T converted) {} }; +template<> +struct InteropTypeConverter { + using InteropType = ani_byte; + static inline KByte convertFrom(ani_env* env, InteropType value) { + return value; + } + static inline InteropType convertTo(ani_env* env, KByte value) { + return value; + } + static inline void release(ani_env* env, InteropType value, KByte converted) {} +}; + +template<> +struct InteropTypeConverter { + using InteropType = ani_boolean; + static inline KBoolean convertFrom(ani_env* env, InteropType value) { + return value; + } + static inline InteropType convertTo(ani_env* env, KBoolean value) { + return value; + } + static inline void release(ani_env* env, InteropType value, KBoolean converted) {} +}; + +template<> +struct InteropTypeConverter { + using InteropType = ani_int; + static inline KInt convertFrom(ani_env* env, InteropType value) { + return value; + } + static inline InteropType convertTo(ani_env* env, KInt value) { + return value; + } + static inline void release(ani_env* env, InteropType value, KInt converted) {} +}; + +template<> +struct InteropTypeConverter { + using InteropType = ani_int; + static inline KUInt convertFrom(ani_env* env, InteropType value) { + return value; + } + static inline InteropType convertTo(ani_env* env, KUInt value) { + return value; + } + static inline void release(ani_env* env, InteropType value, KUInt converted) {} +}; + + +template<> +struct InteropTypeConverter { + using InteropType = ani_float; + static inline KFloat convertFrom(ani_env* env, InteropType value) { + return value; + } + static inline InteropType convertTo(ani_env* env, KFloat value) { + return value; + } + static inline void release(ani_env* env, InteropType value, KFloat converted) {} +}; + +template<> +struct InteropTypeConverter { + using InteropType = ani_object; + static inline KVMObjectHandle convertFrom(ani_env* env, InteropType value) { + return reinterpret_cast(value); + } + static inline InteropType convertTo(ani_env* env, KVMObjectHandle value) { + return reinterpret_cast(value); + } + static inline void release(ani_env* env, InteropType value, KVMObjectHandle converted) {} +}; + +template<> +struct InteropTypeConverter { + using InteropType = ani_fixedarray_byte; + static inline KInteropBuffer convertFrom(ani_env* env, InteropType value) { + if (value == nullptr) return KInteropBuffer(); + ani_size length = 0; + env->FixedArray_GetLength(value, &length); + KByte* data = new KByte[length]; + env->FixedArray_GetRegion_Byte(value, 0, length, (ani_byte*)data); + KInteropBuffer result = { 0 }; + result.data = data; + result.length = length; + return result; + } + static inline InteropType convertTo(ani_env* env, KInteropBuffer value) { + ani_fixedarray_byte result; + env->FixedArray_New_Byte(value.length, &result); + env->FixedArray_SetRegion_Byte(result, 0, value.length, reinterpret_cast(value.data)); + value.dispose(value.resourceId); + return result; + } + static inline void release(ani_env* env, InteropType value, KInteropBuffer converted) { + delete [] (KByte*)converted.data; + } +}; + +template<> +struct InteropTypeConverter { + using InteropType = ani_fixedarray_byte; + static inline KInteropReturnBuffer convertFrom(ani_env* env, InteropType value) = delete; + static inline InteropType convertTo(ani_env* env, KInteropReturnBuffer value) { + ani_fixedarray_byte result; + env->FixedArray_New_Byte(value.length, &result); + env->FixedArray_SetRegion_Byte(result, 0, value.length, reinterpret_cast(value.data)); + value.dispose(value.data, value.length); + return result; + }; + static inline void release(ani_env* env, InteropType value, KInteropReturnBuffer converted) {} +}; + template<> struct InteropTypeConverter { using InteropType = ani_string; @@ -46,12 +159,13 @@ struct InteropTypeConverter { result.resize(lengthUtf8); ani_size lengthUtf16 = 0; env->String_GetUTF16Size(value, &lengthUtf16); - ani_size count; - env->String_GetUTF8SubString(value, 0, lengthUtf16, result.data(), result.length(), &count); + ani_size count = 0; + env->String_GetUTF8SubString(value, 0, lengthUtf16, result.data(), lengthUtf8 + 1, &count); + result.data()[lengthUtf8] = 0; return result; } static InteropType convertTo(ani_env* env, const KStringPtr& value) { - ani_string result; + ani_string result = nullptr; env->String_NewUTF8(value.c_str(), value.length(), &result); return result; } diff --git a/interop/src/cpp/ets/convertors-ets.h b/interop/src/cpp/ets/convertors-ets.h index b8d7f5257d649069b0256da816a209d4b0721dd3..139d1a340e1a6113081c4ae76e4eec4665e9af45 100644 --- a/interop/src/cpp/ets/convertors-ets.h +++ b/interop/src/cpp/ets/convertors-ets.h @@ -55,7 +55,7 @@ struct InteropTypeConverter { template<> struct InteropTypeConverter { - using InteropType = KUInt; + using InteropType = ets_int; static KUInt convertFrom(EtsEnv* env, InteropType value) { return value; } static InteropType convertTo(EtsEnv* env, KUInt value) { return value; } static void release(EtsEnv* env, InteropType value, KUInt converted) {} @@ -79,18 +79,37 @@ struct InteropTypeConverter { template<> struct InteropTypeConverter { - using InteropType = KVMObjectHandle; - static KVMObjectHandle convertFrom(EtsEnv* env, InteropType value) { return value; } - static InteropType convertTo(EtsEnv* env, KVMObjectHandle value) { return value; } + using InteropType = ets_object; + static KVMObjectHandle convertFrom(EtsEnv* env, InteropType value) { + return reinterpret_cast(value); + } + static InteropType convertTo(EtsEnv* env, KVMObjectHandle value) { + return reinterpret_cast(value); + } static void release(EtsEnv* env, InteropType value, KVMObjectHandle converted) {} }; template<> struct InteropTypeConverter { - using InteropType = KInteropBuffer; - static KInteropBuffer convertFrom(EtsEnv* env, InteropType value) { return value; } - static InteropType convertTo(EtsEnv* env, KInteropBuffer value) { return value; } - static void release(EtsEnv* env, InteropType value, KInteropBuffer converted) {} + using InteropType = ets_byteArray; + static KInteropBuffer convertFrom(EtsEnv* env, InteropType value) { + if (!value) return KInteropBuffer(); + KInteropBuffer result; + result.data = (KByte*)env->PinByteArray(value); + result.length = env->GetArrayLength(value); + return result; + } + static InteropType convertTo(EtsEnv* env, KInteropBuffer value) { + ets_byteArray array = env->NewByteArray(value.length); + KByte* data = (KByte*)env->PinByteArray(array); + memcpy(data, (KByte*)value.data, value.length); + env->UnpinByteArray(array); + value.dispose(value.resourceId); + return array; + } + static void release(EtsEnv* env, InteropType value, KInteropBuffer converted) { + env->UnpinByteArray(value); + } }; template<> diff --git a/interop/src/cpp/vmloader.cc b/interop/src/cpp/vmloader.cc index e7eda0d423f7ca522c28c57f70d23030254936fd..407d73fd479cdf9bc1e72ee7bb1bf05eacf43d5c 100644 --- a/interop/src/cpp/vmloader.cc +++ b/interop/src/cpp/vmloader.cc @@ -31,6 +31,10 @@ #include "etsapi.h" #endif +#ifdef KOALA_ANI +#include "ani.h" +#endif + #if defined(KOALA_LINUX) || defined(KOALA_MACOS) || defined(KOALA_OHOS) #include "sys/stat.h" #include "dirent.h" @@ -128,6 +132,7 @@ struct VMInitArgs { #define JAVA_VM_KIND 1 #define PANDA_VM_KIND 2 #define ES2PANDA_KIND 3 +#define PANDA_ANI_VM_KIND 4 struct ForeignVMContext { void* currentVMContext; @@ -165,6 +170,7 @@ static int ArkMobileLog(int id, int level, const char *component, const char *fm return 0; } + extern "C" DLL_EXPORT KInt LoadVirtualMachine(KInt vmKind, const char* appClassPath, const char* appLibPath, const ForeignVMContext* foreignVMContext) { if (vmKind == ES2PANDA_KIND) { return loadES2Panda(appClassPath, appLibPath); @@ -174,8 +180,8 @@ extern "C" DLL_EXPORT KInt LoadVirtualMachine(KInt vmKind, const char* appClassP #ifdef KOALA_JNI (vmKind == JAVA_VM_KIND) ? &javaVMLib : #endif - #ifdef KOALA_ETS_NAPI - (vmKind == PANDA_VM_KIND) ? &pandaVMLib : + #if defined(KOALA_ETS_NAPI) || defined(KOALA_ANI) + (vmKind == PANDA_VM_KIND || vmKind == PANDA_ANI_VM_KIND) ? &pandaVMLib : #endif nullptr; @@ -233,8 +239,9 @@ extern "C" DLL_EXPORT KInt LoadVirtualMachine(KInt vmKind, const char* appClassP } #endif -#ifdef KOALA_ETS_NAPI - if (vmKind == PANDA_VM_KIND) { +// For now we use ETS API for VM startup and entry. +#if defined(KOALA_ETS_NAPI) || defined(KOALA_ANI) + if (vmKind == PANDA_VM_KIND || vmKind == PANDA_ANI_VM_KIND) { EtsVMInitArgs pandaVMArgs; pandaVMArgs.version = ETS_NAPI_VERSION_1_0; std::vector etsVMOptions; @@ -251,9 +258,13 @@ extern "C" DLL_EXPORT KInt LoadVirtualMachine(KInt vmKind, const char* appClassP {EtsOptionType::ETS_BOOT_FILE, (char*)strdup((std::string(thisVM->sdkPath) + "/ets/etsstdlib.abc").c_str())}, #endif }; + std::string all_files; for (const std::string& path : files) { etsVMOptions.push_back({EtsOptionType::ETS_BOOT_FILE, (char*)strdup(path.c_str())}); + if (all_files.size() > 0) all_files.append(":"); + all_files.append(path); } + LOGE("classpath \"%s\" from %s", all_files.c_str(), appClassPath); etsVMOptions.push_back({EtsOptionType::ETS_NATIVE_LIBRARY_PATH, (char*)strdup(std::string(appLibPath).c_str())}); etsVMOptions.push_back({EtsOptionType::ETS_VERIFICATION_MODE, "on-the-fly"}); etsVMOptions.push_back({EtsOptionType::ETS_NO_JIT, nullptr}); @@ -270,10 +281,10 @@ extern "C" DLL_EXPORT KInt LoadVirtualMachine(KInt vmKind, const char* appClassP EtsEnv* pEnv = nullptr; vmInstance->GetEnv(&pEnv, ETS_NAPI_VERSION_1_0); env = static_cast(pEnv); + } else { result = createVM(&vm, &env, &pandaVMArgs); } - } #endif @@ -314,7 +325,7 @@ const AppInfo javaAppInfo = { }; #endif -#ifdef KOALA_ETS_NAPI +#ifdef KOALA_USE_PANDA_VM const AppInfo pandaAppInfo = { "@koalaui/arkts-arkui/Application/Application", "createApplication", @@ -347,9 +358,12 @@ extern "C" DLL_EXPORT KNativePointer StartApplication(const char* appUrl, const #ifdef KOALA_JNI (g_vmEntry.vmKind == JAVA_VM_KIND) ? &javaAppInfo : #endif - #ifdef KOALA_ETS_NAPI + #if defined(KOALA_ETS_NAPI) (g_vmEntry.vmKind == PANDA_VM_KIND) ? isTestEnv ? &harnessAppInfo : &pandaAppInfo : #endif + #if defined(KOALA_ANI) + (g_vmEntry.vmKind == PANDA_ANI_VM_KIND) ? isTestEnv ? &harnessAppInfo : &pandaAppInfo : + #endif nullptr; if (!appInfo) { @@ -393,8 +407,8 @@ extern "C" DLL_EXPORT KNativePointer StartApplication(const char* appUrl, const app, start)); } #endif -#ifdef KOALA_ETS_NAPI - if (g_vmEntry.vmKind == PANDA_VM_KIND) { +#if defined(KOALA_ETS_NAPI) || defined(KOALA_ANI) + if (g_vmEntry.vmKind == PANDA_VM_KIND || g_vmEntry.vmKind == PANDA_ANI_VM_KIND) { EtsEnv* etsEnv = (EtsEnv*)g_vmEntry.env; ets_class appClass = etsEnv->FindClass(appInfo->className); if (!appClass) { @@ -484,8 +498,8 @@ extern "C" DLL_EXPORT KBoolean RunApplication(const KInt arg0, const KInt arg1) return result; } #endif -#ifdef KOALA_ETS_NAPI - if (g_vmEntry.vmKind == PANDA_VM_KIND) { +#if defined(KOALA_ETS_NAPI) || defined(KOALA_ANI) + if (g_vmEntry.vmKind == PANDA_VM_KIND || g_vmEntry.vmKind == PANDA_ANI_VM_KIND) { EtsEnv* etsEnv = (EtsEnv*)(g_vmEntry.env); if (!g_vmEntry.enter) { LOGE("Cannot find enter method"); @@ -505,7 +519,8 @@ extern "C" DLL_EXPORT KBoolean RunApplication(const KInt arg0, const KInt arg1) } return result; } - #endif +#endif + return 1; } @@ -533,7 +548,7 @@ extern "C" DLL_EXPORT const char* EmitEvent(const KInt type, const KInt target, return result; } #endif -#ifdef KOALA_ETS_NAPI +#if defined(KOALA_ETS_NAPI) || defined(KOALA_ANI) if (g_vmEntry.vmKind == PANDA_VM_KIND) { EtsEnv* etsEnv = (EtsEnv*)(g_vmEntry.env); if (!g_vmEntry.emitEvent) { @@ -556,7 +571,7 @@ extern "C" DLL_EXPORT const char* EmitEvent(const KInt type, const KInt target, const char *result = etsEnv->GetStringUTFChars(rv, 0); return result; } - #endif +#endif return "-1"; } @@ -579,7 +594,7 @@ extern "C" DLL_EXPORT void RestartWith(const char* page) { } } #endif -#ifdef KOALA_ETS_NAPI +#if defined(KOALA_ETS_NAPI) || defined(KOALA_ANI) if (g_vmEntry.vmKind == PANDA_VM_KIND) { EtsEnv* etsEnv = (EtsEnv*)(g_vmEntry.env); if (!g_vmEntry.restartWith) { @@ -597,7 +612,7 @@ extern "C" DLL_EXPORT void RestartWith(const char* page) { etsEnv->ErrorClear(); } } - #endif +#endif } void traverseDir(std::string root, std::vector& paths, int depth) {