From 70b7373cf354ff40668fafd378de6e9d13d9e93e Mon Sep 17 00:00:00 2001 From: Pavel Mironchik Date: Tue, 24 Dec 2024 17:07:49 +0300 Subject: [PATCH] partially restore loader --- arkoala-arkts/arkui/src/Application.ts | 7 +--- .../generated/ArkNavPathStackMaterialized.ts | 5 --- .../src/generated/arkts/NativeModuleLoader.ts | 4 ++ arkoala-arkts/arkui/src/generated/ts/index.ts | 3 ++ arkoala/framework/src/Application.ts | 2 +- arkoala/framework/src/Declarations.ts | 4 +- .../src/generated/ArkUINativeModule.ts | 6 +-- .../src/generated/ArkUINativeModuleEmpty.ts | 2 +- arkoala/loader/src/index.perf.ts | 4 +- arkoala/loader/web/NativeModuleWeb.ts | 42 +++++++++---------- arkoala/loader/web/index.web.ts | 2 +- interop/src/arkts/index.sts | 1 - interop/src/arkts/loadLibraries.sts | 5 --- interop/src/interop/index.ts | 2 +- interop/src/interop/loadLibraries.ts | 34 +++++---------- 15 files changed, 50 insertions(+), 73 deletions(-) delete mode 100644 interop/src/arkts/loadLibraries.sts diff --git a/arkoala-arkts/arkui/src/Application.ts b/arkoala-arkts/arkui/src/Application.ts index 23e59a4eb..a04d8af53 100644 --- a/arkoala-arkts/arkui/src/Application.ts +++ b/arkoala-arkts/arkui/src/Application.ts @@ -15,7 +15,7 @@ import { ComputableState, IncrementalNode, GlobalStateManager, StateManager, StateContext, memoEntry, MutableState, createAnimationTimer, callScheduledCallbacks } from "@koalaui/runtime" import { int32, int64 } from "@koalaui/common" -import { pointer, nullptr, KPointer, InteropNativeModule, loadLibraries } from "@koalaui/interop" +import { pointer, nullptr, KPointer, InteropNativeModule } from "@koalaui/interop" import { PeerNode } from "./generated/PeerNode" import { ArkUINodeType } from "./generated/peers/ArkUINodeType" import { ArkUINativeModule, NativeModuleLoader } from "#components" @@ -149,11 +149,6 @@ function drawCurrentCrash(crash: Object) { } export class Application { - static { - loadLibraries(["ArkoalaNative_ark"]) - NativeModuleLoader.init([]) - } - private manager: StateManager | undefined = undefined private root: ComputableState | undefined = undefined private timer: MutableState | undefined = undefined diff --git a/arkoala-arkts/arkui/src/generated/ArkNavPathStackMaterialized.ts b/arkoala-arkts/arkui/src/generated/ArkNavPathStackMaterialized.ts index e14193d95..a6b0864a5 100644 --- a/arkoala-arkts/arkui/src/generated/ArkNavPathStackMaterialized.ts +++ b/arkoala-arkts/arkui/src/generated/ArkNavPathStackMaterialized.ts @@ -48,10 +48,8 @@ import { pointer } from "@koalaui/interop" -import { NavPathStackExtender } from "../handwritten" export class NavPathStack implements MaterializedBase,INTERFACE_NavPathStack { - _extender = new NavPathStackExtender() peer?: Finalizable getPeer(): Finalizable | undefined { return this.peer @@ -75,7 +73,6 @@ export class NavPathStack implements MaterializedBase,INTERFACE_NavPathStack { return ArkUIGeneratedNativeModule._NavPathStack_getFinalizer() } pushPath(info: NavPathInfo, animated?: boolean | undefined | NavigationOptions | undefined): void { - this._extender.push(info.name, info.param) const info_type = runtimeType(info) const animated_type = runtimeType(animated) if ((((RuntimeType.OBJECT) == (info_type)) && (TypeChecker.isNavPathInfo(info, true, true, true, true))) && (((RuntimeType.BOOLEAN == animated_type)) || ((RuntimeType.UNDEFINED == animated_type)))) { @@ -91,7 +88,6 @@ export class NavPathStack implements MaterializedBase,INTERFACE_NavPathStack { throw new Error("Can not select appropriate overload") } pushDestination(info: NavPathInfo, animated?: boolean | undefined | NavigationOptions | undefined): Promise { - this._extender.push(info.name, info.param) const info_type = runtimeType(info) const animated_type = runtimeType(animated) if ((((RuntimeType.OBJECT) == (info_type)) && (TypeChecker.isNavPathInfo(info, true, true, true, true))) && (((RuntimeType.BOOLEAN == animated_type)) || ((RuntimeType.UNDEFINED == animated_type)))) { @@ -185,7 +181,6 @@ export class NavPathStack implements MaterializedBase,INTERFACE_NavPathStack { return this.removeByNavDestinationId_serialize(navDestinationId_casted) } pop(result?: Object | boolean | undefined, animated?: boolean): NavPathInfo | undefined { - this._extender.pop() const result_type = runtimeType(result) const animated_type = runtimeType(animated) if ((((RuntimeType.OBJECT == result_type))) && (((RuntimeType.BOOLEAN == animated_type)) || ((RuntimeType.UNDEFINED == animated_type)))) { diff --git a/arkoala-arkts/arkui/src/generated/arkts/NativeModuleLoader.ts b/arkoala-arkts/arkui/src/generated/arkts/NativeModuleLoader.ts index e64b3201b..bd117d50d 100644 --- a/arkoala-arkts/arkui/src/generated/arkts/NativeModuleLoader.ts +++ b/arkoala-arkts/arkui/src/generated/arkts/NativeModuleLoader.ts @@ -3,6 +3,10 @@ import { KInt, KUint8ArrayPtr } from "@koalaui/interop" import { callCallback } from "../CallbackRegistry" export class NativeModuleLoader { + static arktsLoadLibrary(name: string) { + loadLibrary(name) + } + static callCallbackFromNative(id: KInt, args: KUint8ArrayPtr, length: KInt): KInt { return callCallback(id, args, length) } diff --git a/arkoala-arkts/arkui/src/generated/ts/index.ts b/arkoala-arkts/arkui/src/generated/ts/index.ts index 3e230d51a..76c088faa 100644 --- a/arkoala-arkts/arkui/src/generated/ts/index.ts +++ b/arkoala-arkts/arkui/src/generated/ts/index.ts @@ -3,6 +3,9 @@ export * from "./ArkUINativeModule" export * from "./ArkUIGeneratedNativeModule" export * from "./TestNativeModule" export class NativeModuleLoader { + static arktsLoadLibrary(name: string) { + throw new Error("Stub for TS compilation") + } static init(modules: string[]) { throw new Error("Stub for TS compilation") } diff --git a/arkoala/framework/src/Application.ts b/arkoala/framework/src/Application.ts index dfbf7898a..2dc5bb1bb 100644 --- a/arkoala/framework/src/Application.ts +++ b/arkoala/framework/src/Application.ts @@ -299,7 +299,7 @@ export function startApplication( ): Promise { return new Promise((resolve, reject) => { try { - // initInteropModule(host?.nativeModule) + Object.assign(ArkUINativeModule, host?.arkUINativeModule) } catch (e) { const err = e as Error console.error(err.toString(), err.stack) diff --git a/arkoala/framework/src/Declarations.ts b/arkoala/framework/src/Declarations.ts index 92c5cff52..8007c0d50 100644 --- a/arkoala/framework/src/Declarations.ts +++ b/arkoala/framework/src/Declarations.ts @@ -14,11 +14,11 @@ */ import { int32 } from "@koalaui/common" -import { ArkUINativeModule } from "./generated/ArkUINativeModule" +import { ArkUINativeModuleEmpty } from "./generated/ArkUINativeModuleEmpty" export interface ArkoalaHost { waitForVSync(): Promise | undefined - nativeModule: ArkUINativeModule | undefined + arkUINativeModule: ArkUINativeModuleEmpty | undefined } export interface ArkoalaControl { diff --git a/arkoala/framework/src/generated/ArkUINativeModule.ts b/arkoala/framework/src/generated/ArkUINativeModule.ts index ea728a1f3..42aa1c2ea 100644 --- a/arkoala/framework/src/generated/ArkUINativeModule.ts +++ b/arkoala/framework/src/generated/ArkUINativeModule.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import { KInt, KBoolean, KFloat, KUInt, KStringPtr, KPointer, KNativePointer, KInt32ArrayPtr, KUint8ArrayPtr, KFloat32ArrayPtr, pointer, loadLibraries, registerNativeModule, withByteArray, Access, callCallback, nullptr, InteropNativeModule, providePlatformDefinedData, NativeStringBase, ArrayDecoder, CallbackRegistry } from "@koalaui/interop" +import { KInt, KBoolean, KFloat, KUInt, KStringPtr, KPointer, KNativePointer, KInt32ArrayPtr, KUint8ArrayPtr, KFloat32ArrayPtr, pointer, registerNativeModule, withByteArray, Access, callCallback, nullptr, InteropNativeModule, registerLoadedLibrary, providePlatformDefinedData, NativeStringBase, ArrayDecoder, CallbackRegistry } from "@koalaui/interop" import { int32, float32 } from "@koalaui/common" export class ArkUINativeModule { @@ -160,8 +160,8 @@ export class ArkUINativeModule { } } registerNativeModule("ArkUINativeModule", ArkUINativeModule) -declare const NATIVE_LIB_PATH: string -loadLibraries([NATIVE_LIB_PATH]) +declare const LOAD_NATIVE: string +registerLoadedLibrary(LOAD_NATIVE) class NativeString extends NativeStringBase { constructor(ptr: KPointer) { diff --git a/arkoala/framework/src/generated/ArkUINativeModuleEmpty.ts b/arkoala/framework/src/generated/ArkUINativeModuleEmpty.ts index bf7183b8d..91caf8cdc 100644 --- a/arkoala/framework/src/generated/ArkUINativeModuleEmpty.ts +++ b/arkoala/framework/src/generated/ArkUINativeModuleEmpty.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import { KInt, KBoolean, KFloat, KUInt, KStringPtr, KPointer, KNativePointer, KInt32ArrayPtr, KUint8ArrayPtr, KFloat32ArrayPtr, pointer, loadLibraries } from "@koalaui/interop" +import { KInt, KBoolean, KFloat, KUInt, KStringPtr, KPointer, KNativePointer, KInt32ArrayPtr, KUint8ArrayPtr, KFloat32ArrayPtr, pointer } from "@koalaui/interop" import { int32, float32 } from "@koalaui/common" export class ArkUINativeModuleEmpty { diff --git a/arkoala/loader/src/index.perf.ts b/arkoala/loader/src/index.perf.ts index 4f001f542..f5c4726fb 100644 --- a/arkoala/loader/src/index.perf.ts +++ b/arkoala/loader/src/index.perf.ts @@ -14,7 +14,7 @@ */ import { ArkRooted } from "@koalaui/arkoala-arkui" -import { ArkoalaControl, ArkoalaHost, NativeModuleEmpty, runApplication } from "@koalaui/arkoala" +import { ArkoalaControl, ArkoalaHost, ArkUINativeModuleEmpty, runApplication } from "@koalaui/arkoala" import { __Entry } from "../generated/ets/perf" // Some environment for console-less ark_js_vm @@ -41,7 +41,7 @@ async function runArkoala(host: Partial|undefined, callback: (contr error => print(error.toString()), { waitForVSync: () => Promise.resolve(), - nativeModule: host?.nativeModule ?? new NativeModuleEmpty() + arkUINativeModule: host?.arkUINativeModule ?? new ArkUINativeModuleEmpty() } ) } diff --git a/arkoala/loader/web/NativeModuleWeb.ts b/arkoala/loader/web/NativeModuleWeb.ts index 6919404b1..107df504c 100644 --- a/arkoala/loader/web/NativeModuleWeb.ts +++ b/arkoala/loader/web/NativeModuleWeb.ts @@ -15,14 +15,14 @@ import { Alignment, ComponentAsyncEventSubKind, - NativeModuleEmpty, NativeNodeFlags, PeerEventKind, parseLength, UndefinedDimensionUnit, align, CustomNodeOpType, - toColor + toColor, + ArkUINativeModuleEmpty } from "@koalaui/arkoala" import { decodeToString, KFloat, KFloat32ArrayPtr, KInt, KPointer, KStringPtr, callCallback } from "@koalaui/interop" import { HEAP32, HEAP8 } from "./NativeHeap" @@ -137,7 +137,7 @@ class TreeNodePointer { } } -export class NativeModuleWeb extends NativeModuleEmpty { +export class NativeModuleWeb extends ArkUINativeModuleEmpty { currentId = 0 constructor(private root: HTMLElement) { @@ -157,7 +157,7 @@ export class NativeModuleWeb extends NativeModuleEmpty { } private crashShown = false - _ShowCrash(messagePtr: KStringPtr): void { + override _ShowCrash(messagePtr: KStringPtr): void { if (this.crashShown) return this.crashShown = true let message = getString(messagePtr) @@ -175,7 +175,7 @@ export class NativeModuleWeb extends NativeModuleEmpty { this.root.appendChild(popup) } - _CreateNode(type: KInt, id: KInt, flags: KInt): KPointer { + override _CreateNode(type: KInt, id: KInt, flags: KInt): KPointer { let node = createElement(type, id) if (type === ArkUINodeId.Root) { node.style.color = "#000000ff" @@ -185,7 +185,7 @@ export class NativeModuleWeb extends NativeModuleEmpty { return new TreeNodePointer(node, flags).asPointer() } - _DisposeNode(ptr: KPointer): void { + override _DisposeNode(ptr: KPointer): void { TreeNodePointer.fromPointer(ptr).peer.remove() } @@ -193,7 +193,7 @@ export class NativeModuleWeb extends NativeModuleEmpty { TreeNodePointer.fromPointer(node).callbackId = callbackId } - _MeasureLayoutAndDraw(root: KPointer): KInt { + override _MeasureLayoutAndDraw(root: KPointer): KInt { // TODO: we must get this values from root node const rootMeasures = new Float32Array([600, 295, 600, 600]) this._MeasureNode(root, rootMeasures) @@ -205,7 +205,7 @@ export class NativeModuleWeb extends NativeModuleEmpty { return 0 } - _MeasureNode(rootPtr: KPointer, data: KFloat32ArrayPtr): KInt { + override _MeasureNode(rootPtr: KPointer, data: KFloat32ArrayPtr): KInt { let root = TreeNodePointer.fromPointer(rootPtr) // TODO: rewrite! if (typeof(data) == "number") { @@ -259,7 +259,7 @@ export class NativeModuleWeb extends NativeModuleEmpty { return 0 } - _LayoutNode(rootPtr: KPointer, data: KFloat32ArrayPtr): KInt { + override _LayoutNode(rootPtr: KPointer, data: KFloat32ArrayPtr): KInt { // TODO: rewrite! let root = TreeNodePointer.fromPointer(rootPtr) if (typeof(data) == "number") { @@ -310,7 +310,7 @@ export class NativeModuleWeb extends NativeModuleEmpty { return 0 } - _DrawNode(rootPtr: KPointer, data: KFloat32ArrayPtr): KInt { + override _DrawNode(rootPtr: KPointer, data: KFloat32ArrayPtr): KInt { // TODO: rewrite! let root = TreeNodePointer.fromPointer(rootPtr) if (root.flags & NativeNodeFlags.CustomDraw) { @@ -332,10 +332,10 @@ export class NativeModuleWeb extends NativeModuleEmpty { TreeNodePointer.fromPointer(ptr).peer.style.background = toColor(value) } - _SetMeasureWidth(root: KPointer, value: number): void { + override _SetMeasureWidth(root: KPointer, value: number): void { TreeNodePointer.fromPointer(root).measureResult[0] = value } - _GetMeasureWidth(root: KPointer): number { + override _GetMeasureWidth(root: KPointer): number { const result = TreeNodePointer.fromPointer(root).measureResult[0] if (result == 0) { const rect = TreeNodePointer.fromPointer(root).peer.getBoundingClientRect() @@ -344,10 +344,10 @@ export class NativeModuleWeb extends NativeModuleEmpty { } return result } - _SetMeasureHeight(root: KPointer, value: number): void { + override _SetMeasureHeight(root: KPointer, value: number): void { TreeNodePointer.fromPointer(root).measureResult[1] = value } - _GetMeasureHeight(root: KPointer): number { + override _GetMeasureHeight(root: KPointer): number { const result = TreeNodePointer.fromPointer(root).measureResult[1] if (result == 0) { const rect = TreeNodePointer.fromPointer(root).peer.getBoundingClientRect() @@ -356,21 +356,21 @@ export class NativeModuleWeb extends NativeModuleEmpty { } return result } - _SetX(root: KPointer, value: KFloat): void { + override _SetX(root: KPointer, value: KFloat): void { let peer = TreeNodePointer.fromPointer(root).peer peer.style.position = "absolute" peer.style.left = value + "px" } - _SetY(root: KPointer, value: KFloat): void { + override _SetY(root: KPointer, value: KFloat): void { let peer = TreeNodePointer.fromPointer(root).peer peer.style.position = "absolute" peer.style.top = value + "px" } - _SetAlignment(root: KPointer, value: KInt): void { + override _SetAlignment(root: KPointer, value: KInt): void { TreeNodePointer.fromPointer(root).alignment = value } - _GetAlignment(root: KPointer): KInt { + override _GetAlignment(root: KPointer): KInt { return TreeNodePointer.fromPointer(root).alignment } @@ -386,16 +386,16 @@ export class NativeModuleWeb extends NativeModuleEmpty { TreeNodePointer.fromPointer(ptr).peer.textContent = getString(value) } - _AddChild(parent: KPointer, child: KPointer): number { + override _AddChild(parent: KPointer, child: KPointer): number { TreeNodePointer.fromPointer(parent).add(TreeNodePointer.fromPointer(child)) return 0 // todo: return proper value } - _RemoveChild(parent: KPointer, child: KPointer): void { + override _RemoveChild(parent: KPointer, child: KPointer): void { if (child) { TreeNodePointer.fromPointer(parent).remove(TreeNodePointer.fromPointer(child)) } } - _InsertChildAfter(parent: KPointer, child: KPointer, sibling: KPointer): number { + override _InsertChildAfter(parent: KPointer, child: KPointer, sibling: KPointer): number { TreeNodePointer.fromPointer(parent).insert( TreeNodePointer.fromPointer(child), TreeNodePointer.fromPointer(sibling) diff --git a/arkoala/loader/web/index.web.ts b/arkoala/loader/web/index.web.ts index f1c610296..e255311b0 100644 --- a/arkoala/loader/web/index.web.ts +++ b/arkoala/loader/web/index.web.ts @@ -27,6 +27,6 @@ export type HTMLDivElement = any export function startArkoalaWeb(rootId: string) { return startApplication(ArkRooted(__Entry), { waitForVSync: () => new Promise((resolve) => setTimeout(resolve, 1)), - nativeModule: new NativeModuleWeb(document.getElementById(rootId)!) + arkUINativeModule: new NativeModuleWeb(document.getElementById(rootId)!) }) } diff --git a/interop/src/arkts/index.sts b/interop/src/arkts/index.sts index 6c608ee32..8ac2223d6 100644 --- a/interop/src/arkts/index.sts +++ b/interop/src/arkts/index.sts @@ -18,5 +18,4 @@ export * from "./callback" export * from "./buffer" export * from "../interop/ResourceManager" export * from "./NativeBuffer" -export * from "./loadLibraries" export * from "./InteropNativeModule" diff --git a/interop/src/arkts/loadLibraries.sts b/interop/src/arkts/loadLibraries.sts deleted file mode 100644 index c36529fff..000000000 --- a/interop/src/arkts/loadLibraries.sts +++ /dev/null @@ -1,5 +0,0 @@ -export function loadLibraries(libraries: string[]) { - for (const lib of libraries) { - loadLibrary(lib) - } -} diff --git a/interop/src/interop/index.ts b/interop/src/interop/index.ts index 6521cf968..9606ea794 100644 --- a/interop/src/interop/index.ts +++ b/interop/src/interop/index.ts @@ -66,5 +66,5 @@ export * from "./InteropOps" export * from "./buffer" export * from "./ResourceManager" export * from "./NativeBuffer" -export { loadLibraries, registerNativeModule } from "./loadLibraries" +export { registerLoadedLibrary, registerNativeModule } from "./loadLibraries" export { InteropNativeModule } from "./InteropNativeModule" diff --git a/interop/src/interop/loadLibraries.ts b/interop/src/interop/loadLibraries.ts index be37ebb22..2bbe1b8b6 100644 --- a/interop/src/interop/loadLibraries.ts +++ b/interop/src/interop/loadLibraries.ts @@ -1,32 +1,18 @@ -import * as path from "path" -import * as process from "process" -import * as os from "os" - const nativeModulesToLoad: Map = new Map() const lateInitNativeModules: Map = new Map() -function loadLibrary(name: string): Record { - const libPath = path.resolve(name + ".node"); // TODO lib dir, support es6 modules, etc. - console.debug("Loading native library from " + libPath) - const exports = {} - ;(process as any).dlopen({ exports }, libPath, (os.constants as any).dlopen.RTLD_NOW) ; //TODO fix @types/node - return exports -} -export function loadLibraries(libraries: string[]) { - for (const lib of libraries) { - const modules = loadLibrary(lib) - if (!modules) continue - console.debug("Loaded native modules: " + JSON.stringify(Object.keys(modules))) - for (const moduleName of Object.keys(modules)) { - const target = nativeModulesToLoad.get(moduleName); - if (!target) { - lateInitNativeModules.set(moduleName, modules[moduleName]); - continue - } - Object.assign(target, modules[moduleName]) // TODO freeze? - nativeModulesToLoad.delete(moduleName) +export function registerLoadedLibrary(library: any) { + if (!library) return + console.debug("Loaded native modules: " + JSON.stringify(Object.keys(library))) + for (const moduleName of Object.keys(library)) { + const target = nativeModulesToLoad.get(moduleName); + if (!target) { + lateInitNativeModules.set(moduleName, library[moduleName]); + continue } + Object.assign(target, library[moduleName]) // TODO freeze? + nativeModulesToLoad.delete(moduleName) } } -- Gitee