6
6
#include <js_native_api_types.h>
7
7
#include <node_api.h>
8
8
#include <node_api_types.h>
9
+ #include <stdint.h>
9
10
10
11
#ifdef SDL_PLATFORM_OHOS
11
12
@@ -28,28 +29,32 @@ static struct
28
29
napi_ref interface ;
29
30
} napiEnv ;
30
31
31
- typedef union
32
+ typedef enum
32
33
{
33
- int i ;
34
- short s ;
35
- char c ;
36
- long long l ;
37
- float f ;
38
- double d ;
39
- const char * str ;
40
- bool b ;
34
+ Int ,
35
+ Long ,
36
+ Double ,
37
+ String
38
+ } napiArgType ;
39
+
40
+ typedef struct
41
+ {
42
+ napiArgType type ;
43
+ union
44
+ {
45
+ int i ;
46
+ long long l ;
47
+ double d ;
48
+ const char * str ;
49
+ } data ;
41
50
} napiCallbackArg ;
42
51
typedef struct
43
52
{
44
53
const char * func ;
45
- napiCallbackArg arg1 ;
46
- napiCallbackArg arg2 ;
47
- napiCallbackArg arg3 ;
48
- napiCallbackArg arg4 ;
49
- napiCallbackArg arg5 ;
50
- napiCallbackArg arg6 ;
51
- napiCallbackArg arg7 ;
52
- napiCallbackArg arg8 ;
54
+ int argCount ;
55
+ napiCallbackArg arg [16 ];
56
+ napiArgType type ;
57
+ napiCallbackArg ret ;
53
58
} napiCallbackData ;
54
59
55
60
void OHOS_windowDataFill (SDL_Window * w )
@@ -175,11 +180,61 @@ static napi_value minus(napi_env env, napi_callback_info info)
175
180
176
181
static void sdlJSCallback (napi_env env , napi_value jsCb , void * content , void * data )
177
182
{
183
+ napiCallbackData * ar = (napiCallbackData * ) data ;
184
+
178
185
napi_value callb = NULL ;
179
186
napi_get_reference_value (env , napiEnv .interface , & callb );
180
187
napi_value jsMethod = NULL ;
181
- napi_get_named_property (env , callb , "test" , & jsMethod );
182
- napi_call_function (env , NULL , jsMethod , 0 , NULL , NULL );
188
+ napi_get_named_property (env , callb , ar -> func , & jsMethod );
189
+
190
+ napi_value args [16 ];
191
+ for (int i = 0 ; i < ar -> argCount ; i ++ )
192
+ {
193
+ switch (ar -> arg [i ].type )
194
+ {
195
+ case Int : {
196
+ napi_create_int32 (env , ar -> arg [i ].data .i , args + i );
197
+ break ;
198
+ }
199
+ case Long : {
200
+ napi_create_int64 (env , ar -> arg [i ].data .l , args + i );
201
+ break ;
202
+ }
203
+ case Double : {
204
+ napi_create_double (env , ar -> arg [i ].data .d , args + i );
205
+ break ;
206
+ }
207
+ case String : {
208
+ napi_create_string_utf8 (env , ar -> arg [i ].data .str , SDL_strlen (ar -> arg [i ].data .str ), args + i );
209
+ break ;
210
+ }
211
+ }
212
+ }
213
+
214
+ napi_value v ;
215
+ napi_call_function (env , NULL , jsMethod , ar -> argCount , args , & v );
216
+ switch (ar -> type ) {
217
+ case Int : {
218
+ napi_get_value_int32 (env , v , & ar -> ret .data .i );
219
+ break ;
220
+ }
221
+ case Long : {
222
+ napi_get_value_int64 (env , v , (int64_t * ) & ar -> ret .data .l );
223
+ break ;
224
+ }
225
+ case String : {
226
+ size_t stringSize = 0 ;
227
+ napi_get_value_string_utf8 (env , args [1 ], NULL , 0 , & stringSize );
228
+ char * value = SDL_malloc (stringSize + 1 );
229
+ napi_get_value_string_utf8 (env , args [1 ], value , stringSize + 1 , & stringSize );
230
+ ar -> ret .data .str = value ;
231
+ break ;
232
+ }
233
+ case Double : {
234
+ napi_get_value_double (env , v , & ar -> ret .data .d );
235
+ break ;
236
+ }
237
+ }
183
238
}
184
239
185
240
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)
196
251
napi_create_string_utf8 (env , "SDLThreadSafe" , NAPI_AUTO_LENGTH , & resName );
197
252
napi_create_threadsafe_function (env , args [0 ], NULL , resName , 0 , 1 , NULL , NULL , NULL , sdlJSCallback , & napiEnv .func );
198
253
199
- napi_call_threadsafe_function (napiEnv .func , NULL , napi_tsfn_nonblocking );
254
+ napiCallbackData data ;
255
+ data .func = "test" ;
256
+ data .argCount = 0 ;
257
+
258
+ napi_call_threadsafe_function (napiEnv .func , & data , napi_tsfn_nonblocking );
200
259
201
260
napi_value result ;
202
261
napi_create_int32 (env , 0 , & result );
0 commit comments