diff --git a/arkoala-arkts/libarkts/native/meson.build b/arkoala-arkts/libarkts/native/meson.build index 115f7ef9ed22f402a8bd2a3a3a677bc9e6304aa8..24e3059ea0c04dc529e774066f4957eb2f890078 100644 --- a/arkoala-arkts/libarkts/native/meson.build +++ b/arkoala-arkts/libarkts/native/meson.build @@ -1,95 +1,95 @@ -project('Es2panda interop', 'cpp', - version: '0.1', - default_options: ['cpp_std=c++17', 'buildtype=debug'], -) - -source_dir = meson.current_source_dir() -interop_src = '../../../interop/src/cpp' -es2panda_header = '../node_modules/@koalaui/plugin-api-panda-sdk/@panda/sdk/ohos_arm64/include/tools/es2panda/public' -es2panda_gen = '../node_modules/@koalaui/plugin-api-panda-sdk/@panda/sdk/ohos_arm64/include/tools/es2panda/' -is_msvc = meson.get_compiler('cpp').get_id() == 'msvc' - -implementation = './src/es2panda_lib.cc' - -os = target_machine.system() - -sources = [ - implementation, - interop_src / 'common-interop.cc' -] -include_dirs = [ - es2panda_header, - es2panda_gen -] -library_use_name = 'Es2panda' -cflags = ['-DINTEROP_LIBRARY_NAME=' + library_use_name] -ldflags = [] -deps = [] - -if os == 'windows' - cflags += ['-DKOALA_WINDOWS'] - if is_msvc - # apply node.exe symbol loading hook - sources += [ - interop_src / 'napi/win-dynamic-node.cc' - ] - endif -endif - -if os == 'linux' - cflags += ['-DKOALA_LINUX'] -endif - -include_dirs += [ - interop_src, - interop_src / 'types', -] - -sources += [ - interop_src / 'napi/convertors-napi.cc', -] - -node_addon_api = run_command('node', '-p', 'require.resolve("node-addon-api/package.json").slice(0, -12)', check: true).stdout().strip() -node_api_headers = run_command('node', '-p', 'require.resolve("node-api-headers/package.json").slice(0, -12)', check: true).stdout().strip() - -include_dirs += [ - interop_src / 'napi', - node_api_headers / 'include', - node_addon_api, -] -cflags += [ - '-DKOALA_USE_NODE_VM', - '-DKOALA_NAPI' -] - -module_prefix = '' -module_suffix = 'node' - -shared_library( - library_use_name, - sources, - override_options: [ - 'b_lundef=false', - ], - install: true, - name_prefix: module_prefix, - name_suffix: module_suffix, - include_directories: include_dirs, - install_dir: source_dir / '..' / 'build', - cpp_args: cflags, - link_args: ldflags, - dependencies: deps -) - -playground_exec_name = 'playground_exec' - -sources = [ - './src/playground.cc' -] - -executable( - playground_exec_name, - sources, - include_directories: include_dirs, - cpp_args: cflags -) +project('Es2panda interop', 'cpp', + version: '0.1', + default_options: ['cpp_std=c++17', 'buildtype=debug'], +) + +source_dir = meson.current_source_dir() +interop_src = '../../../interop/src/cpp' +es2panda_header = '../node_modules/@koalaui/plugin-api-panda-sdk/@panda/sdk/ohos_arm64/include/tools/es2panda/public' +es2panda_gen = '../node_modules/@koalaui/plugin-api-panda-sdk/@panda/sdk/ohos_arm64/include/tools/es2panda/' +is_msvc = meson.get_compiler('cpp').get_id() == 'msvc' + +implementation = './src/es2panda_lib.cc' + +os = target_machine.system() + +sources = [ + implementation, + interop_src / 'common-interop.cc', +] +include_dirs = [ + es2panda_header, + es2panda_gen +] +library_use_name = 'Es2panda' +cflags = ['-DINTEROP_LIBRARY_NAME=' + library_use_name] +ldflags = [] +deps = [] + +if os == 'windows' + cflags += ['-DKOALA_WINDOWS'] + if is_msvc + # apply node.exe symbol loading hook + sources += [ + interop_src / 'napi/win-dynamic-node.cc' + ] + endif +endif + +if os == 'linux' + cflags += ['-DKOALA_LINUX'] +endif + +include_dirs += [ + interop_src, + interop_src / 'types', +] + +sources += [ + interop_src / 'napi/convertors-napi.cc', +] + +node_addon_api = run_command('node', '-p', 'require.resolve("node-addon-api/package.json").slice(0, -12)', check: true).stdout().strip() +node_api_headers = run_command('node', '-p', 'require.resolve("node-api-headers/package.json").slice(0, -12)', check: true).stdout().strip() + +include_dirs += [ + interop_src / 'napi', + node_api_headers / 'include', + node_addon_api, +] +cflags += [ + '-DKOALA_USE_NODE_VM', + '-DKOALA_NAPI' +] + +module_prefix = '' +module_suffix = 'node' + +shared_library( + library_use_name, + sources, + override_options: [ + 'b_lundef=false', + ], + install: true, + name_prefix: module_prefix, + name_suffix: module_suffix, + include_directories: include_dirs, + install_dir: source_dir / '..' / 'build', + cpp_args: cflags, + link_args: ldflags, + dependencies: deps +) + +playground_exec_name = 'playground_exec' + +sources = [ + './src/playground.cc' +] + +executable( + playground_exec_name, + sources, + include_directories: include_dirs, + cpp_args: cflags +) diff --git a/arkoala/arkui/src/peers/SerializerBase.ts b/arkoala/arkui/src/peers/SerializerBase.ts index 92d38fde1195c9730878002173118b620959b9b8..5f8683cbf81473eaeb0ef0ad0c31b9699687eabe 100644 --- a/arkoala/arkui/src/peers/SerializerBase.ts +++ b/arkoala/arkui/src/peers/SerializerBase.ts @@ -211,8 +211,9 @@ export class SerializerBase { const resourceId = ResourceManager.registerAndHold(resource) this.heldResources.push(resourceId) this.writeInt32(resourceId) - this.writePointer(nativeModule()._GetManagedResourceHolder()) - this.writePointer(nativeModule()._GetManagedResourceReleaser()) + this.writePointer(0) // holder + this.writePointer(0) // releaser + this.writePointer(0) // caller } private releaseResources() { for (const resourceId of this.heldResources) diff --git a/arkoala/framework/native/meson.build b/arkoala/framework/native/meson.build index b66656ac773f308f3c0b95eae1e82ee52416b20e..c5f2f4d9c5b04b5d192f419a4c15f167ecbecd88 100644 --- a/arkoala/framework/native/meson.build +++ b/arkoala/framework/native/meson.build @@ -26,7 +26,8 @@ arkoala_sources = [ ] sources = [ - interop_src / 'common-interop.cc' + interop_src / 'common-interop.cc', + interop_src / 'callbacks.cc' ] include_dirs = [ @@ -250,7 +251,7 @@ shared_library(library_use_name, ) if get_option('vmloader') == true - + vmloader_cflags = ['-DKOALA_' + os.to_upper()] vmloader_ldflags = [] diff --git a/arkoala/framework/native/src/DeserializerBase.cc b/arkoala/framework/native/src/DeserializerBase.cc index 1c2d6389b1546505174fe069e66850677a23357a..17e2d599f21d03448b53c07f64a6a0fbb11fd7d1 100644 --- a/arkoala/framework/native/src/DeserializerBase.cc +++ b/arkoala/framework/native/src/DeserializerBase.cc @@ -1,3 +1,3 @@ #include "DeserializerBase.h" -CustomDeserializer* DeserializerBase::customDeserializers = nullptr; \ No newline at end of file +CustomDeserializer* DeserializerBase::customDeserializers = nullptr; diff --git a/arkoala/framework/native/src/DeserializerBase.h b/arkoala/framework/native/src/DeserializerBase.h index a80ca4294a41be8d1d762c3209cf4d9b8f535b7c..c060fe1336997e3259465fc33ff02871681038fc 100644 --- a/arkoala/framework/native/src/DeserializerBase.h +++ b/arkoala/framework/native/src/DeserializerBase.h @@ -23,6 +23,19 @@ using namespace std; +// TODO: provide real impl +inline KNativePointer getCallbackCaller(KInt kind) { + return nullptr; +} + +inline KNativePointer getDefaultHoldMethod() { + return nullptr; +} + +inline KNativePointer getDefaultReleaseMethod() { + return nullptr; +} + inline const char *tagName(Ark_Tag tag) { switch (tag) @@ -395,12 +408,12 @@ public: strcat(result.kind, kind.c_str()); return result; } - + Ark_CallbackResource readCallbackResource() { Ark_CallbackResource result = {}; result.resourceId = readInt32(); - result.hold = reinterpret_cast(readPointer()); - result.release = reinterpret_cast(readPointer()); + result.hold = reinterpret_cast(readPointerOrDefault(&holdMethod)); + result.release = reinterpret_cast(readPointerOrDefault(&releaseMethod)); return result; } @@ -450,6 +463,13 @@ public: position += 8; return reinterpret_cast(value); } + Ark_NativePointer readPointerOrDefault(Ark_NativePointer defaultValue) + { + check(8); + int64_t value = *(int64_t *)(data + position); + position += 8; + return value ? reinterpret_cast(value) : defaultValue; + } Ark_Number readNumber() { check(5); diff --git a/arkoala/framework/native/src/callbacks.cc b/arkoala/framework/native/src/callbacks.cc index d2911bbfddca05848f5b218e8f87d4dad1222a1a..59c6ec056aa80d23794d14bd6748855d734d98eb 100644 --- a/arkoala/framework/native/src/callbacks.cc +++ b/arkoala/framework/native/src/callbacks.cc @@ -44,13 +44,3 @@ KInt impl_PopFrontCallback() { return 1; } KOALA_INTEROP_0(PopFrontCallback, KInt) - -KNativePointer impl_GetManagedResourceHolder() { - return 0; -} -KOALA_INTEROP_0(GetManagedResourceHolder, KNativePointer) - -KNativePointer impl_GetManagedResourceReleaser() { - return 0; -} -KOALA_INTEROP_0(GetManagedResourceReleaser, KNativePointer) \ No newline at end of file diff --git a/arkoala/framework/native/src/callbacks.h b/arkoala/framework/native/src/callbacks.h index d4a47240d3ce58b85c320fce0ecf66f2d14ab4a9..744b2386be03407811401c7a82f5d8a613761255 100644 --- a/arkoala/framework/native/src/callbacks.h +++ b/arkoala/framework/native/src/callbacks.h @@ -29,4 +29,4 @@ struct CallbackBuffer { }; void enqueueArkoalaCallback(const CallbackBuffer* event); -#endif \ No newline at end of file +#endif // _ARKOALA_CALLBACKS_H \ No newline at end of file diff --git a/arkoala/framework/native/src/generated/arkoala_api_generated.h b/arkoala/framework/native/src/generated/arkoala_api_generated.h index ca7257a1f1ba1235d7f8c17d74fb3a9ff47e887c..d63d6ca3bf9d59e539a20a8c0beed627b6f8df77 100644 --- a/arkoala/framework/native/src/generated/arkoala_api_generated.h +++ b/arkoala/framework/native/src/generated/arkoala_api_generated.h @@ -20703,4 +20703,3 @@ struct Ark_AnyAPI { /* clang-format on */ #endif // GENERATED_FOUNDATION_ACE_FRAMEWORKS_CORE_INTERFACES_ARKOALA_API_H - diff --git a/interop/src/cpp/common-interop.cc b/interop/src/cpp/common-interop.cc index 2de0d74f8ad8b1a4566b4d8d4a30ad4cf3f5b264..91744bc170021429a3dc1c37880fa63cf27ff99a 100644 --- a/interop/src/cpp/common-interop.cc +++ b/interop/src/cpp/common-interop.cc @@ -262,7 +262,6 @@ void impl_StopGroupedLog(KInt index) { } KOALA_INTEROP_V1(StopGroupedLog, KInt) - typedef KInt (*LoadVirtualMachine_t)(KInt vmKind, const char* appClassPath, const char* appLibPath); typedef KInt (*StartApplication_t)(); typedef KInt (*RunApplication_t)(const KInt arg0, const KInt arg1); @@ -334,4 +333,33 @@ void impl_NativeLog(const KStringPtr& str) { fflush(stdout); #endif } -KOALA_INTEROP_V1(NativeLog, KStringPtr) +KOALA_INTEROP_V1(NativeLog, KStringPtr); + +CallCallback_t g_callMethod = nullptr; +HoldCallback_t g_holdMethod = nullptr; +ReleaseCallback_t g_releaseMethod = nullptr; + +void setCallbackMethods(CallCallback_t call, HoldCallback_t hold, ReleaseCallback_t release) { + g_callMethod = call; + g_holdMethod = hold; + g_releaseMethod = release; +} + +void impl_CallCallback(KInt callbackKind, KByte* args, KInt argsSize) { + if (g_callMethod) { + g_callMethod(callbackKind, args, argsSize); + } +} +KOALA_INTEROP_V3(CallCallback, KInt, KByte*, KInt) + +KNativePointer getDefaultHoldMethod() { + return reinterpret_cast(g_holdMethod); +} + +KNativePointer getDefaultReleaseMethod() { + return reinterpret_cast(g_releaseMethod); +} + +KNativePointer getDefaultCallMethod(KInt kind) { + return g_callMethodBySignature(kind); +} \ No newline at end of file diff --git a/interop/src/cpp/common-interop.h b/interop/src/cpp/common-interop.h index fa0f8ae14f35fadb4027d1fe93a711760b518c55..0312a7be5817dc110f84418de94b1f0c0753a935 100644 --- a/interop/src/cpp/common-interop.h +++ b/interop/src/cpp/common-interop.h @@ -44,6 +44,13 @@ std::vector makeStringVector(KStringArray strArray); std::vector makeStringVector(KNativePointerArray arr, KInt size); +// Externally provided method to deserialize and call particular callback. +typedef void (*CallCallback_t)(KInt, KByte*, KInt); +typedef void (*HoldCallback_t)(KInt, KNativePointer); +typedef void (*ReleaseCallback_t)(KInt, KNativePointer); + +void setCallbackMethods(CallCallback_t call, HoldCallback_t hold, ReleaseCallback_t release); + // Grouped logs. void startGroupedLog(KInt kind); void stopGroupedLog(KInt kind);