From 56ccf29d3cfec8a630a7d3f477558073090baaa2 Mon Sep 17 00:00:00 2001 From: Jack253-png Date: Sun, 1 Jun 2025 15:18:20 +0800 Subject: [PATCH] Harmony port: napi shell --- src/core/ohos/SDL_ohos.c | 99 ++++++++++++++++++++++++++++++++-------- 1 file changed, 79 insertions(+), 20 deletions(-) diff --git a/src/core/ohos/SDL_ohos.c b/src/core/ohos/SDL_ohos.c index ea91343f87..e7a41b9067 100644 --- a/src/core/ohos/SDL_ohos.c +++ b/src/core/ohos/SDL_ohos.c @@ -6,6 +6,7 @@ #include #include #include +#include #ifdef SDL_PLATFORM_OHOS @@ -28,28 +29,32 @@ static struct napi_ref interface; } napiEnv; -typedef union +typedef enum { - int i; - short s; - char c; - long long l; - float f; - double d; - const char* str; - bool b; + Int, + Long, + Double, + String +} napiArgType; + +typedef struct +{ + napiArgType type; + union + { + int i; + long long l; + double d; + const char* str; + } data; } napiCallbackArg; typedef struct { const char* func; - napiCallbackArg arg1; - napiCallbackArg arg2; - napiCallbackArg arg3; - napiCallbackArg arg4; - napiCallbackArg arg5; - napiCallbackArg arg6; - napiCallbackArg arg7; - napiCallbackArg arg8; + int argCount; + napiCallbackArg arg[16]; + napiArgType type; + napiCallbackArg ret; } napiCallbackData; void OHOS_windowDataFill(SDL_Window* w) @@ -175,11 +180,61 @@ static napi_value minus(napi_env env, napi_callback_info info) static void sdlJSCallback(napi_env env, napi_value jsCb, void* content, void* data) { + napiCallbackData* ar = (napiCallbackData*) data; + napi_value callb = NULL; napi_get_reference_value(env, napiEnv.interface, &callb); napi_value jsMethod = NULL; - napi_get_named_property(env, callb, "test", &jsMethod); - napi_call_function(env, NULL, jsMethod, 0, NULL, NULL); + napi_get_named_property(env, callb, ar->func, &jsMethod); + + napi_value args[16]; + for (int i = 0; i < ar->argCount; i++) + { + switch (ar->arg[i].type) + { + case Int: { + napi_create_int32(env, ar->arg[i].data.i, args + i); + break; + } + case Long: { + napi_create_int64(env, ar->arg[i].data.l, args + i); + break; + } + case Double: { + napi_create_double(env, ar->arg[i].data.d, args + i); + break; + } + case String: { + napi_create_string_utf8(env, ar->arg[i].data.str, SDL_strlen(ar->arg[i].data.str), args + i); + break; + } + } + } + + napi_value v; + napi_call_function(env, NULL, jsMethod, ar->argCount, args, &v); + switch (ar->type) { + case Int: { + napi_get_value_int32(env, v, &ar->ret.data.i); + break; + } + case Long: { + napi_get_value_int64(env, v, (int64_t*) &ar->ret.data.l); + break; + } + case String: { + size_t stringSize = 0; + napi_get_value_string_utf8(env, args[1], NULL, 0, &stringSize); + char* value = SDL_malloc(stringSize + 1); + napi_get_value_string_utf8(env, args[1], value, stringSize + 1, &stringSize); + ar->ret.data.str = value; + break; + } + case Double: { + napi_get_value_double(env, v, &ar->ret.data.d); + break; + } + } } static napi_value sdlCallbackInit(napi_env env, napi_callback_info info) @@ -196,7 +251,11 @@ static napi_value sdlCallbackInit(napi_env env, napi_callback_info info) napi_create_string_utf8(env, "SDLThreadSafe", NAPI_AUTO_LENGTH, &resName); napi_create_threadsafe_function(env, args[0], NULL, resName, 0, 1, NULL, NULL, NULL, sdlJSCallback, &napiEnv.func); - napi_call_threadsafe_function(napiEnv.func, NULL, napi_tsfn_nonblocking); + napiCallbackData data; + data.func = "test"; + data.argCount = 0; + + napi_call_threadsafe_function(napiEnv.func, &data, napi_tsfn_nonblocking); napi_value result; napi_create_int32(env, 0, &result);