diff --git a/Ndk/Ndk2/ImportThirdPartyLibraries/oh-package-lock.json5 b/Ndk/Ndk2/ImportThirdPartyLibraries/oh-package-lock.json5 index de2073e5eacf26b8c2ee111258c81f93d216c285..77782370a3ed2852735c5e649e15edfc4487704a 100644 --- a/Ndk/Ndk2/ImportThirdPartyLibraries/oh-package-lock.json5 +++ b/Ndk/Ndk2/ImportThirdPartyLibraries/oh-package-lock.json5 @@ -11,7 +11,7 @@ "packages": { "libapplication.so@src/main/cpp/types/libapplication": { "name": "libapplication.so", - "version": "0.0.0", + "version": "1.0.0", "resolved": "src/main/cpp/types/libapplication", "registryType": "local" }, diff --git a/Ndk/ndk1/IntegrateThirdPartySO/src/main/cpp/SubSobyDlOpenSo/SubSobyDlOpenSo.cpp b/Ndk/ndk1/IntegrateThirdPartySO/src/main/cpp/SubSobyDlOpenSo/SubSobyDlOpenSo.cpp index 5c4ae628f66f42a542752ad04205100581b7462e..4d39d6142dac38b0dc55c679b9d9f1cd1f374950 100644 --- a/Ndk/ndk1/IntegrateThirdPartySO/src/main/cpp/SubSobyDlOpenSo/SubSobyDlOpenSo.cpp +++ b/Ndk/ndk1/IntegrateThirdPartySO/src/main/cpp/SubSobyDlOpenSo/SubSobyDlOpenSo.cpp @@ -3,13 +3,9 @@ // // Node APIs are not fully supported. To solve the compilation error of the interface cannot be found, // please include "napi/native_api.h". -/** - * FAQ: 在Native侧如何集成三方SO库 - */ #include "napi/native_api.h" #include "SubSobyDlOpenSo.h" -// [Start dlopen_so_cpp] #include typedef double (*Sub)(double, double); static napi_value SubSobyDlOpenSo(napi_env env, napi_callback_info info) { @@ -30,5 +26,4 @@ static napi_value SubSobyDlOpenSo(napi_env env, napi_callback_info info) { napi_create_double(env, sub_func(value0, value1), &result); dlclose(handle); // Finally, close the dynamic library return result; -} -// [End dlopen_so_cpp] \ No newline at end of file +} \ No newline at end of file diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/.gitignore b/Ndk/ndk1/IntegrateThirdPartySO1/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e2713a2779c5a3e0eb879efe6115455592caeea5 --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/build-profile.json5 b/Ndk/ndk1/IntegrateThirdPartySO1/build-profile.json5 new file mode 100644 index 0000000000000000000000000000000000000000..38bdcc9929e2c5bd7f51c4fc96a398ccebd0d6ce --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/build-profile.json5 @@ -0,0 +1,39 @@ +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "", + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + }, + "nativeLib": { + "debugSymbol": { + "strip": true, + "exclude": [] + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/hvigorfile.ts b/Ndk/ndk1/IntegrateThirdPartySO1/hvigorfile.ts new file mode 100644 index 0000000000000000000000000000000000000000..c6edcd90486dd5a853cf7d34c8647f08414ca7a3 --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/hvigorfile.ts @@ -0,0 +1,6 @@ +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/obfuscation-rules.txt b/Ndk/ndk1/IntegrateThirdPartySO1/obfuscation-rules.txt new file mode 100644 index 0000000000000000000000000000000000000000..272efb6ca3f240859091bbbfc7c5802d52793b0b --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/obfuscation-rules.txt @@ -0,0 +1,23 @@ +# Define project specific obfuscation rules here. +# You can include the obfuscation configuration files in the current module's build-profile.json5. +# +# For more details, see +# https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/source-obfuscation-V5 + +# Obfuscation options: +# -disable-obfuscation: disable all obfuscations +# -enable-property-obfuscation: obfuscate the property names +# -enable-toplevel-obfuscation: obfuscate the names in the global scope +# -compact: remove unnecessary blank spaces and all line feeds +# -remove-log: remove all console.* statements +# -print-namecache: print the name cache that contains the mapping from the old names to new names +# -apply-namecache: reuse the given cache file + +# Keep options: +# -keep-property-name: specifies property names that you want to keep +# -keep-global-name: specifies names that you want to keep in the global scope + +-enable-property-obfuscation +-enable-toplevel-obfuscation +-enable-filename-obfuscation +-enable-export-obfuscation \ No newline at end of file diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/oh-package.json5 b/Ndk/ndk1/IntegrateThirdPartySO1/oh-package.json5 new file mode 100644 index 0000000000000000000000000000000000000000..b4be90f5f2bcbaac1a872becb536995bc72777b3 --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/oh-package.json5 @@ -0,0 +1,10 @@ +{ + "name": "integratethirdpartyso1", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": { + } +} \ No newline at end of file diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/main/cpp/CMakeLists.txt b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..30ad9a8e298741611ffc3308dc4b20fd0d7bdc74 --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/cpp/CMakeLists.txt @@ -0,0 +1,8 @@ +# FAQ:在Native侧如何集成三方SO库 +# [Start native_sub] +# CMakeLists.txt +cmake_minimum_required(VERSION 3.4.1) +project(libSub) +#编译源码 +add_library(nativeSub SHARED sub.cpp) +# [End native_sub] \ No newline at end of file diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/main/cpp/napi_init.cpp b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/cpp/napi_init.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f4fc1ad5d65fc84e83c493f1eda59ecdfe27738c --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/cpp/napi_init.cpp @@ -0,0 +1,53 @@ +#include "napi/native_api.h" + +static napi_value Add(napi_env env, napi_callback_info info) +{ + size_t argc = 2; + napi_value args[2] = {nullptr}; + + napi_get_cb_info(env, info, &argc, args , nullptr, nullptr); + + napi_valuetype valuetype0; + napi_typeof(env, args[0], &valuetype0); + + napi_valuetype valuetype1; + napi_typeof(env, args[1], &valuetype1); + + double value0; + napi_get_value_double(env, args[0], &value0); + + double value1; + napi_get_value_double(env, args[1], &value1); + + napi_value sum; + napi_create_double(env, value0 + value1, &sum); + + return sum; + +} + +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + napi_property_descriptor desc[] = { + { "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr } + }; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "integratethirdpartyso1", + .nm_priv = ((void*)0), + .reserved = { 0 }, +}; + +extern "C" __attribute__((constructor)) void RegisterIntegrateThirdPartySO1Module(void) +{ + napi_module_register(&demoModule); +} diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/main/cpp/sub.cpp b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/cpp/sub.cpp new file mode 100644 index 0000000000000000000000000000000000000000..592db4d9d82a2e6c708cf2d08e71013b2130bc02 --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/cpp/sub.cpp @@ -0,0 +1,17 @@ +// +// Created on 2025/5/29. +// +// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found, +// please include "napi/native_api.h". +/** + * FAQ:在Native侧如何集成三方SO库 + */ +// [Start native_sub] +// sub.cpp +#include +#include "sub.h" +double sub(double a, double b) +{ + return a - b; +} +// [End native_sub] \ No newline at end of file diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/main/cpp/sub.h b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/cpp/sub.h new file mode 100644 index 0000000000000000000000000000000000000000..3eea55e4e7dc8a7e6575659532db91dcbb3723c2 --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/cpp/sub.h @@ -0,0 +1,14 @@ +// +// Created on 2025/5/29. +// +// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found, +// please include "napi/native_api.h". +/** + * FAQ:在Native侧如何集成三方SO库 + */ +// [Start native_sub] +// sub.h +extern "C" { +double sub(double a, double b); +} +// [End native_sub] diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/main/cpp/types/libintegratethirdpartyso1/Index.d.ts b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/cpp/types/libintegratethirdpartyso1/Index.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..e44f3615a4767c36b4fdc841b781af96bf1971a8 --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/cpp/types/libintegratethirdpartyso1/Index.d.ts @@ -0,0 +1 @@ +export const add: (a: number, b: number) => number; \ No newline at end of file diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/main/cpp/types/libintegratethirdpartyso1/oh-package.json5 b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/cpp/types/libintegratethirdpartyso1/oh-package.json5 new file mode 100644 index 0000000000000000000000000000000000000000..13199ac2d85a05d8340c880bf3c5979512f37019 --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/cpp/types/libintegratethirdpartyso1/oh-package.json5 @@ -0,0 +1,6 @@ +{ + "name": "libintegratethirdpartyso1.so", + "types": "./Index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/main/ets/integratethirdpartyso1ability/IntegrateThirdPartySO1Ability.ets b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/ets/integratethirdpartyso1ability/IntegrateThirdPartySO1Ability.ets new file mode 100644 index 0000000000000000000000000000000000000000..7ceb264637ffae6c5a4f4ff3302f7642c0e4b713 --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/ets/integratethirdpartyso1ability/IntegrateThirdPartySO1Ability.ets @@ -0,0 +1,43 @@ +import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +const DOMAIN = 0x0000; + +export default class IntegrateThirdPartySO1Ability extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err)); + return; + } + hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onBackground'); + } +} diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/main/ets/pages/Index.ets b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/ets/pages/Index.ets new file mode 100644 index 0000000000000000000000000000000000000000..cd35f054ca946e612e4fb81900687857d40ae4c8 --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/ets/pages/Index.ets @@ -0,0 +1,24 @@ +import { hilog } from '@kit.PerformanceAnalysisKit'; + +const DOMAIN = 0x0000; + +@Entry +@Component +struct Index { + @State message: string = 'Hello World'; + + build() { + Row() { + Column() { + Text(this.message) + .fontSize($r('app.float.page_text_font_size')) + .fontWeight(FontWeight.Bold) + .onClick(() => { + this.message = 'Welcome'; + }) + } + .width('100%') + } + .height('100%') + } +} diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/main/module.json5 b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/module.json5 new file mode 100644 index 0000000000000000000000000000000000000000..ed3e938238f1edeaab124caecbb5651de87fbe08 --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/module.json5 @@ -0,0 +1,28 @@ +{ + "module": { + "name": "IntegrateThirdPartySO1", + "type": "feature", + "description": "$string:module_desc", + "mainElement": "IntegrateThirdPartySO1Ability", + "deviceTypes": [ + "phone", + "tablet", + "2in1" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "IntegrateThirdPartySO1Ability", + "srcEntry": "./ets/integratethirdpartyso1ability/IntegrateThirdPartySO1Ability.ets", + "description": "$string:IntegrateThirdPartySO1Ability_desc", + "icon": "$media:layered_image", + "label": "$string:IntegrateThirdPartySO1Ability_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true + } + ] + } +} \ No newline at end of file diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/element/color.json b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/element/color.json new file mode 100644 index 0000000000000000000000000000000000000000..3c712962da3c2751c2b9ddb53559afcbd2b54a02 --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/element/float.json b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/element/float.json new file mode 100644 index 0000000000000000000000000000000000000000..33ea22304f9b1485b5f22d811023701b5d4e35b6 --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/element/float.json @@ -0,0 +1,8 @@ +{ + "float": [ + { + "name": "page_text_font_size", + "value": "50fp" + } + ] +} diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/element/string.json b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/element/string.json new file mode 100644 index 0000000000000000000000000000000000000000..8602ff5adb61294495e9d69df21a9aaa59385d23 --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "IntegrateThirdPartySO1Ability_desc", + "value": "description" + }, + { + "name": "IntegrateThirdPartySO1Ability_label", + "value": "label" + } + ] +} \ No newline at end of file diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/media/background.png b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..923f2b3f27e915d6871871deea0420eb45ce102f Binary files /dev/null and b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/media/background.png differ diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/media/foreground.png b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..97014d3e10e5ff511409c378cd4255713aecd85f Binary files /dev/null and b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/media/foreground.png differ diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/media/layered_image.json b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/media/layered_image.json new file mode 100644 index 0000000000000000000000000000000000000000..fb49920440fb4d246c82f9ada275e26123a2136a --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/media/layered_image.json @@ -0,0 +1,7 @@ +{ + "layered-image": + { + "background" : "$media:background", + "foreground" : "$media:foreground" + } +} \ No newline at end of file diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/media/startIcon.png b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/media/startIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..205ad8b5a8a42e8762fbe4899b8e5e31ce822b8b Binary files /dev/null and b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/media/startIcon.png differ diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/profile/main_pages.json b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000000000000000000000000000000000000..1898d94f58d6128ab712be2c68acc7c98e9ab9ce --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/Index" + ] +} diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/mock/Libintegratethirdpartyso1.mock.ets b/Ndk/ndk1/IntegrateThirdPartySO1/src/mock/Libintegratethirdpartyso1.mock.ets new file mode 100644 index 0000000000000000000000000000000000000000..c2171716d040a605ef6af71e90b937a945f2677d --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/mock/Libintegratethirdpartyso1.mock.ets @@ -0,0 +1,7 @@ +const NativeMock: Record = { + 'add': (a: number, b: number) => { + return a + b; + }, +}; + +export default NativeMock; \ No newline at end of file diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/mock/mock-config.json5 b/Ndk/ndk1/IntegrateThirdPartySO1/src/mock/mock-config.json5 new file mode 100644 index 0000000000000000000000000000000000000000..db3dd7a60d6a46e295039a087c005f71898c5023 --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/mock/mock-config.json5 @@ -0,0 +1,5 @@ +{ + "libintegratethirdpartyso1.so": { + "source": "src/mock/Libintegratethirdpartyso1.mock.ets" + } +} \ No newline at end of file diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/ohosTest/ets/test/Ability.test.ets b/Ndk/ndk1/IntegrateThirdPartySO1/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..85c78f67579d6e31b5f5aeea463e216b9b141048 --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,35 @@ +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/ohosTest/ets/test/List.test.ets b/Ndk/ndk1/IntegrateThirdPartySO1/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..794c7dc4ed66bd98fa3865e07922906e2fcef545 --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,5 @@ +import abilityTest from './Ability.test'; + +export default function testsuite() { + abilityTest(); +} \ No newline at end of file diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/ohosTest/module.json5 b/Ndk/ndk1/IntegrateThirdPartySO1/src/ohosTest/module.json5 new file mode 100644 index 0000000000000000000000000000000000000000..0ec0f98ec4648664f89c9de57260a4698f4f182b --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/ohosTest/module.json5 @@ -0,0 +1,13 @@ +{ + "module": { + "name": "IntegrateThirdPartySO1_test", + "type": "feature", + "deviceTypes": [ + "phone", + "tablet", + "2in1" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/test/List.test.ets b/Ndk/ndk1/IntegrateThirdPartySO1/src/test/List.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..bb5b5c3731e283dd507c847560ee59bde477bbc7 --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/test/List.test.ets @@ -0,0 +1,5 @@ +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/Ndk/ndk1/IntegrateThirdPartySO1/src/test/LocalUnit.test.ets b/Ndk/ndk1/IntegrateThirdPartySO1/src/test/LocalUnit.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..165fc1615ee8618b4cb6a622f144a9a707eee99f --- /dev/null +++ b/Ndk/ndk1/IntegrateThirdPartySO1/src/test/LocalUnit.test.ets @@ -0,0 +1,33 @@ +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/Ndk/ndk1/Modulea/.gitignore b/Ndk/ndk1/Modulea/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e2713a2779c5a3e0eb879efe6115455592caeea5 --- /dev/null +++ b/Ndk/ndk1/Modulea/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/Ndk/ndk1/Modulea/build-profile.json5 b/Ndk/ndk1/Modulea/build-profile.json5 new file mode 100644 index 0000000000000000000000000000000000000000..38bdcc9929e2c5bd7f51c4fc96a398ccebd0d6ce --- /dev/null +++ b/Ndk/ndk1/Modulea/build-profile.json5 @@ -0,0 +1,39 @@ +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "", + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + }, + "nativeLib": { + "debugSymbol": { + "strip": true, + "exclude": [] + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/Ndk/ndk1/Modulea/hvigorfile.ts b/Ndk/ndk1/Modulea/hvigorfile.ts new file mode 100644 index 0000000000000000000000000000000000000000..c6edcd90486dd5a853cf7d34c8647f08414ca7a3 --- /dev/null +++ b/Ndk/ndk1/Modulea/hvigorfile.ts @@ -0,0 +1,6 @@ +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/Ndk/ndk1/Modulea/obfuscation-rules.txt b/Ndk/ndk1/Modulea/obfuscation-rules.txt new file mode 100644 index 0000000000000000000000000000000000000000..272efb6ca3f240859091bbbfc7c5802d52793b0b --- /dev/null +++ b/Ndk/ndk1/Modulea/obfuscation-rules.txt @@ -0,0 +1,23 @@ +# Define project specific obfuscation rules here. +# You can include the obfuscation configuration files in the current module's build-profile.json5. +# +# For more details, see +# https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/source-obfuscation-V5 + +# Obfuscation options: +# -disable-obfuscation: disable all obfuscations +# -enable-property-obfuscation: obfuscate the property names +# -enable-toplevel-obfuscation: obfuscate the names in the global scope +# -compact: remove unnecessary blank spaces and all line feeds +# -remove-log: remove all console.* statements +# -print-namecache: print the name cache that contains the mapping from the old names to new names +# -apply-namecache: reuse the given cache file + +# Keep options: +# -keep-property-name: specifies property names that you want to keep +# -keep-global-name: specifies names that you want to keep in the global scope + +-enable-property-obfuscation +-enable-toplevel-obfuscation +-enable-filename-obfuscation +-enable-export-obfuscation \ No newline at end of file diff --git a/Ndk/ndk1/Modulea/oh-package.json5 b/Ndk/ndk1/Modulea/oh-package.json5 new file mode 100644 index 0000000000000000000000000000000000000000..1ae9e21f66d450780e41dd2177b4ed16427cb66c --- /dev/null +++ b/Ndk/ndk1/Modulea/oh-package.json5 @@ -0,0 +1,15 @@ +// FAQ:如何跨Hap模块调用C++ API +{ + "name": "modulea", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + // [Start native_lib] + "dependencies": { + "libmodulea.so": "file:./src/main/cpp/types/libmodulea", + "moduleb": "file:../Moduleb" + }, + // [End native_lib] +} \ No newline at end of file diff --git a/Ndk/ndk1/Modulea/src/main/cpp/CMakeLists.txt b/Ndk/ndk1/Modulea/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..e608e40f8b8577fa97ae710e976f8d53514b6490 --- /dev/null +++ b/Ndk/ndk1/Modulea/src/main/cpp/CMakeLists.txt @@ -0,0 +1,17 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.5.0) +project(ndk1) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +if(DEFINED PACKAGE_FIND_FILE) + include(${PACKAGE_FIND_FILE}) +endif() + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include) + +add_library(modulea SHARED napi_init.cpp) +# [Start native_lib] +target_link_libraries(modulea PUBLIC libace_napi.z.so moduleb::moduleb) +# [End native_lib] \ No newline at end of file diff --git a/Ndk/ndk1/Modulea/src/main/cpp/napi_init.cpp b/Ndk/ndk1/Modulea/src/main/cpp/napi_init.cpp new file mode 100644 index 0000000000000000000000000000000000000000..382e6fc7041fdaf9a3fb72ac09a86d672eb8e110 --- /dev/null +++ b/Ndk/ndk1/Modulea/src/main/cpp/napi_init.cpp @@ -0,0 +1,95 @@ +/** + * FAQ:napi_call_function调用时除了会有pending exception外,是否还有其他异常场景 + */ +#include "napi/native_api.h" + +void Test(napi_env env, napi_callback_info info){ + napi_value object; + // [Start napi_create_object] + napi_status status = napi_create_object(env, &object); + if (status != napi_ok) { + napi_throw_error(env, nullptr, "Error"); + return; + } + // [End napi_create_object] +} + +static napi_value Add(napi_env env, napi_callback_info info) +{ + size_t argc = 2; + napi_value args[2] = {nullptr}; + + napi_get_cb_info(env, info, &argc, args , nullptr, nullptr); + + napi_valuetype valuetype0; + napi_typeof(env, args[0], &valuetype0); + + napi_valuetype valuetype1; + napi_typeof(env, args[1], &valuetype1); + + double value0; + napi_get_value_double(env, args[0], &value0); + + double value1; + napi_get_value_double(env, args[1], &value1); + + napi_value sum; + napi_create_double(env, value0 + value1, &sum); + + return sum; + +} + +static napi_value Sub(napi_env env, napi_callback_info info) +{ + size_t argc = 2; + napi_value args[2] = {nullptr}; + + napi_get_cb_info(env, info, &argc, args , nullptr, nullptr); + + napi_valuetype valuetype0; + napi_typeof(env, args[0], &valuetype0); + + napi_valuetype valuetype1; + napi_typeof(env, args[1], &valuetype1); + + double value0; + napi_get_value_double(env, args[0], &value0); + + double value1; + napi_get_value_double(env, args[1], &value1); + + napi_value sum; + napi_create_double(env, value0 + value1, &sum); + + return sum; + +} + + +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + napi_property_descriptor desc[] = { + { "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "sub", nullptr, Sub, nullptr, nullptr, nullptr, napi_default, nullptr } + }; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "modulea", + .nm_priv = ((void*)0), + .reserved = { 0 }, +}; + +extern "C" __attribute__((constructor)) void RegisterModuleaModule(void) +{ + napi_module_register(&demoModule); +} diff --git a/Ndk/ndk1/Modulea/src/main/cpp/types/libmodulea/Index.d.ts b/Ndk/ndk1/Modulea/src/main/cpp/types/libmodulea/Index.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..5b38ab1d58169bf3d0745ad3bcbe470d244ceda7 --- /dev/null +++ b/Ndk/ndk1/Modulea/src/main/cpp/types/libmodulea/Index.d.ts @@ -0,0 +1,7 @@ +/** + * FAQ:如何通过多个xxx.d.ts文件导出Native侧接口 + */ +// [Start index_sub] +export {sub} from './index1' +export const add: (a: number, b: number) => number; +// [End index_sub] \ No newline at end of file diff --git a/Ndk/ndk1/Modulea/src/main/cpp/types/libmodulea/index1.d.ts b/Ndk/ndk1/Modulea/src/main/cpp/types/libmodulea/index1.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..2230be49e7cd294dc37afccaa4978cdfca36c16e --- /dev/null +++ b/Ndk/ndk1/Modulea/src/main/cpp/types/libmodulea/index1.d.ts @@ -0,0 +1,6 @@ +/** + * FAQ:如何通过多个xxx.d.ts文件导出Native侧接口 + */ +// [Start index_sub] +export const sub: (a: number, b: number) => number; +// [End index_sub] \ No newline at end of file diff --git a/Ndk/ndk1/Modulea/src/main/cpp/types/libmodulea/oh-package.json5 b/Ndk/ndk1/Modulea/src/main/cpp/types/libmodulea/oh-package.json5 new file mode 100644 index 0000000000000000000000000000000000000000..04d016c8c8117c67e859fb5066f0c6d57ce5048d --- /dev/null +++ b/Ndk/ndk1/Modulea/src/main/cpp/types/libmodulea/oh-package.json5 @@ -0,0 +1,6 @@ +{ + "name": "libmodulea.so", + "types": "./Index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/Ndk/ndk1/Modulea/src/main/ets/moduleaability/ModuleaAbility.ets b/Ndk/ndk1/Modulea/src/main/ets/moduleaability/ModuleaAbility.ets new file mode 100644 index 0000000000000000000000000000000000000000..c3bf9d9f17afd6652ccbd20bed3da8751672af3d --- /dev/null +++ b/Ndk/ndk1/Modulea/src/main/ets/moduleaability/ModuleaAbility.ets @@ -0,0 +1,43 @@ +import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +const DOMAIN = 0x0000; + +export default class ModuleaAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err)); + return; + } + hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onBackground'); + } +} diff --git a/Ndk/ndk1/Modulea/src/main/ets/pages/Index.ets b/Ndk/ndk1/Modulea/src/main/ets/pages/Index.ets new file mode 100644 index 0000000000000000000000000000000000000000..a6f7ef4590e8e385efb03c02688596a1c1b82f08 --- /dev/null +++ b/Ndk/ndk1/Modulea/src/main/ets/pages/Index.ets @@ -0,0 +1,26 @@ +import { hilog } from '@kit.PerformanceAnalysisKit'; +import testNapi from 'libmodulea.so'; + +const DOMAIN = 0x0000; + +@Entry +@Component +struct Index { + @State message: string = 'Hello World'; + + build() { + Row() { + Column() { + Text(this.message) + .fontSize($r('app.float.page_text_font_size')) + .fontWeight(FontWeight.Bold) + .onClick(() => { + this.message = 'Welcome'; + hilog.info(DOMAIN, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(2, 3)); + }) + } + .width('100%') + } + .height('100%') + } +} diff --git a/Ndk/ndk1/Modulea/src/main/module.json5 b/Ndk/ndk1/Modulea/src/main/module.json5 new file mode 100644 index 0000000000000000000000000000000000000000..12f018d9dc7124ddf5064163a6f42254ef667436 --- /dev/null +++ b/Ndk/ndk1/Modulea/src/main/module.json5 @@ -0,0 +1,28 @@ +{ + "module": { + "name": "Modulea", + "type": "feature", + "description": "$string:module_desc", + "mainElement": "ModuleaAbility", + "deviceTypes": [ + "phone", + "tablet", + "2in1" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "ModuleaAbility", + "srcEntry": "./ets/moduleaability/ModuleaAbility.ets", + "description": "$string:ModuleaAbility_desc", + "icon": "$media:layered_image", + "label": "$string:ModuleaAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true + } + ] + } +} \ No newline at end of file diff --git a/Ndk/ndk1/Modulea/src/main/resources/base/element/color.json b/Ndk/ndk1/Modulea/src/main/resources/base/element/color.json new file mode 100644 index 0000000000000000000000000000000000000000..3c712962da3c2751c2b9ddb53559afcbd2b54a02 --- /dev/null +++ b/Ndk/ndk1/Modulea/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/Ndk/ndk1/Modulea/src/main/resources/base/element/float.json b/Ndk/ndk1/Modulea/src/main/resources/base/element/float.json new file mode 100644 index 0000000000000000000000000000000000000000..33ea22304f9b1485b5f22d811023701b5d4e35b6 --- /dev/null +++ b/Ndk/ndk1/Modulea/src/main/resources/base/element/float.json @@ -0,0 +1,8 @@ +{ + "float": [ + { + "name": "page_text_font_size", + "value": "50fp" + } + ] +} diff --git a/Ndk/ndk1/Modulea/src/main/resources/base/element/string.json b/Ndk/ndk1/Modulea/src/main/resources/base/element/string.json new file mode 100644 index 0000000000000000000000000000000000000000..7793a5fc635a2487b900d116cc329ea753e87cf0 --- /dev/null +++ b/Ndk/ndk1/Modulea/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "ModuleaAbility_desc", + "value": "description" + }, + { + "name": "ModuleaAbility_label", + "value": "label" + } + ] +} \ No newline at end of file diff --git a/Ndk/ndk1/Modulea/src/main/resources/base/media/background.png b/Ndk/ndk1/Modulea/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..923f2b3f27e915d6871871deea0420eb45ce102f Binary files /dev/null and b/Ndk/ndk1/Modulea/src/main/resources/base/media/background.png differ diff --git a/Ndk/ndk1/Modulea/src/main/resources/base/media/foreground.png b/Ndk/ndk1/Modulea/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..97014d3e10e5ff511409c378cd4255713aecd85f Binary files /dev/null and b/Ndk/ndk1/Modulea/src/main/resources/base/media/foreground.png differ diff --git a/Ndk/ndk1/Modulea/src/main/resources/base/media/layered_image.json b/Ndk/ndk1/Modulea/src/main/resources/base/media/layered_image.json new file mode 100644 index 0000000000000000000000000000000000000000..fb49920440fb4d246c82f9ada275e26123a2136a --- /dev/null +++ b/Ndk/ndk1/Modulea/src/main/resources/base/media/layered_image.json @@ -0,0 +1,7 @@ +{ + "layered-image": + { + "background" : "$media:background", + "foreground" : "$media:foreground" + } +} \ No newline at end of file diff --git a/Ndk/ndk1/Modulea/src/main/resources/base/media/startIcon.png b/Ndk/ndk1/Modulea/src/main/resources/base/media/startIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..205ad8b5a8a42e8762fbe4899b8e5e31ce822b8b Binary files /dev/null and b/Ndk/ndk1/Modulea/src/main/resources/base/media/startIcon.png differ diff --git a/Ndk/ndk1/Modulea/src/main/resources/base/profile/main_pages.json b/Ndk/ndk1/Modulea/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000000000000000000000000000000000000..1898d94f58d6128ab712be2c68acc7c98e9ab9ce --- /dev/null +++ b/Ndk/ndk1/Modulea/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/Index" + ] +} diff --git a/Ndk/ndk1/Modulea/src/mock/Libmodulea.mock.ets b/Ndk/ndk1/Modulea/src/mock/Libmodulea.mock.ets new file mode 100644 index 0000000000000000000000000000000000000000..c2171716d040a605ef6af71e90b937a945f2677d --- /dev/null +++ b/Ndk/ndk1/Modulea/src/mock/Libmodulea.mock.ets @@ -0,0 +1,7 @@ +const NativeMock: Record = { + 'add': (a: number, b: number) => { + return a + b; + }, +}; + +export default NativeMock; \ No newline at end of file diff --git a/Ndk/ndk1/Modulea/src/mock/mock-config.json5 b/Ndk/ndk1/Modulea/src/mock/mock-config.json5 new file mode 100644 index 0000000000000000000000000000000000000000..398a61d795e3cdfe70956e24bbe635fb19788d74 --- /dev/null +++ b/Ndk/ndk1/Modulea/src/mock/mock-config.json5 @@ -0,0 +1,5 @@ +{ + "libmodulea.so": { + "source": "src/mock/Libmodulea.mock.ets" + } +} \ No newline at end of file diff --git a/Ndk/ndk1/Modulea/src/ohosTest/ets/test/Ability.test.ets b/Ndk/ndk1/Modulea/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..85c78f67579d6e31b5f5aeea463e216b9b141048 --- /dev/null +++ b/Ndk/ndk1/Modulea/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,35 @@ +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/Ndk/ndk1/Modulea/src/ohosTest/ets/test/List.test.ets b/Ndk/ndk1/Modulea/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..794c7dc4ed66bd98fa3865e07922906e2fcef545 --- /dev/null +++ b/Ndk/ndk1/Modulea/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,5 @@ +import abilityTest from './Ability.test'; + +export default function testsuite() { + abilityTest(); +} \ No newline at end of file diff --git a/Ndk/ndk1/Modulea/src/ohosTest/module.json5 b/Ndk/ndk1/Modulea/src/ohosTest/module.json5 new file mode 100644 index 0000000000000000000000000000000000000000..c693c5bd9a097773e473b00d3bec3d88b1d6d56d --- /dev/null +++ b/Ndk/ndk1/Modulea/src/ohosTest/module.json5 @@ -0,0 +1,13 @@ +{ + "module": { + "name": "Modulea_test", + "type": "feature", + "deviceTypes": [ + "phone", + "tablet", + "2in1" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/Ndk/ndk1/Modulea/src/test/List.test.ets b/Ndk/ndk1/Modulea/src/test/List.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..bb5b5c3731e283dd507c847560ee59bde477bbc7 --- /dev/null +++ b/Ndk/ndk1/Modulea/src/test/List.test.ets @@ -0,0 +1,5 @@ +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/Ndk/ndk1/Modulea/src/test/LocalUnit.test.ets b/Ndk/ndk1/Modulea/src/test/LocalUnit.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..165fc1615ee8618b4cb6a622f144a9a707eee99f --- /dev/null +++ b/Ndk/ndk1/Modulea/src/test/LocalUnit.test.ets @@ -0,0 +1,33 @@ +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/Ndk/ndk1/Moduleb/.gitignore b/Ndk/ndk1/Moduleb/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e2713a2779c5a3e0eb879efe6115455592caeea5 --- /dev/null +++ b/Ndk/ndk1/Moduleb/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/Ndk/ndk1/Moduleb/Index.ets b/Ndk/ndk1/Moduleb/Index.ets new file mode 100644 index 0000000000000000000000000000000000000000..aae957d81d252f33754de5e81c49a2e50361bea4 --- /dev/null +++ b/Ndk/ndk1/Moduleb/Index.ets @@ -0,0 +1 @@ +export { add } from './src/main/ets/utils/Calc'; \ No newline at end of file diff --git a/Ndk/ndk1/Moduleb/build-profile.json5 b/Ndk/ndk1/Moduleb/build-profile.json5 new file mode 100644 index 0000000000000000000000000000000000000000..4c8c192c2f0e11bd729952c2533df7fc9f1d7402 --- /dev/null +++ b/Ndk/ndk1/Moduleb/build-profile.json5 @@ -0,0 +1,43 @@ +// FAQ:如何跨Hap模块调用C++ API +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "" + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + }, + // [Start native_lib] + "nativeLib": { + "debugSymbol": { + "strip": true, + "exclude": [] + }, + "headerPath": "src/main/cpp/include" + }, + // [End native_lib] + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest" + } + ] +} \ No newline at end of file diff --git a/Ndk/ndk1/Moduleb/hvigorfile.ts b/Ndk/ndk1/Moduleb/hvigorfile.ts new file mode 100644 index 0000000000000000000000000000000000000000..d993120bd71f5f5dfe04480be9dc5f73c00c2599 --- /dev/null +++ b/Ndk/ndk1/Moduleb/hvigorfile.ts @@ -0,0 +1,6 @@ +import { hspTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hspTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/Ndk/ndk1/Moduleb/obfuscation-rules.txt b/Ndk/ndk1/Moduleb/obfuscation-rules.txt new file mode 100644 index 0000000000000000000000000000000000000000..272efb6ca3f240859091bbbfc7c5802d52793b0b --- /dev/null +++ b/Ndk/ndk1/Moduleb/obfuscation-rules.txt @@ -0,0 +1,23 @@ +# Define project specific obfuscation rules here. +# You can include the obfuscation configuration files in the current module's build-profile.json5. +# +# For more details, see +# https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/source-obfuscation-V5 + +# Obfuscation options: +# -disable-obfuscation: disable all obfuscations +# -enable-property-obfuscation: obfuscate the property names +# -enable-toplevel-obfuscation: obfuscate the names in the global scope +# -compact: remove unnecessary blank spaces and all line feeds +# -remove-log: remove all console.* statements +# -print-namecache: print the name cache that contains the mapping from the old names to new names +# -apply-namecache: reuse the given cache file + +# Keep options: +# -keep-property-name: specifies property names that you want to keep +# -keep-global-name: specifies names that you want to keep in the global scope + +-enable-property-obfuscation +-enable-toplevel-obfuscation +-enable-filename-obfuscation +-enable-export-obfuscation \ No newline at end of file diff --git a/Ndk/ndk1/Moduleb/oh-package.json5 b/Ndk/ndk1/Moduleb/oh-package.json5 new file mode 100644 index 0000000000000000000000000000000000000000..38b965287c968f9bb67b5634c61344d7e9c5700a --- /dev/null +++ b/Ndk/ndk1/Moduleb/oh-package.json5 @@ -0,0 +1,12 @@ +{ + "name": "moduleb", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "Index.ets", + "author": "", + "license": "Apache-2.0", + "packageType": "InterfaceHar", + "dependencies": { + "libmoduleb.so": "file:./src/main/cpp/types/libmoduleb" + } +} \ No newline at end of file diff --git a/Ndk/ndk1/Moduleb/src/main/cpp/CMakeLists.txt b/Ndk/ndk1/Moduleb/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..998135a19cc9a768b607ddd294f93afda10746a1 --- /dev/null +++ b/Ndk/ndk1/Moduleb/src/main/cpp/CMakeLists.txt @@ -0,0 +1,15 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.5.0) +project(myNpmLib) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +if(DEFINED PACKAGE_FIND_FILE) + include(${PACKAGE_FIND_FILE}) +endif() + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include) + +add_library(moduleb SHARED napi_init.cpp) +target_link_libraries(moduleb PUBLIC libace_napi.z.so) \ No newline at end of file diff --git a/Ndk/ndk1/Moduleb/src/main/cpp/napi_init.cpp b/Ndk/ndk1/Moduleb/src/main/cpp/napi_init.cpp new file mode 100644 index 0000000000000000000000000000000000000000..23334fdb1e90988b183ee4cddda2079854d6e473 --- /dev/null +++ b/Ndk/ndk1/Moduleb/src/main/cpp/napi_init.cpp @@ -0,0 +1,53 @@ +#include "napi/native_api.h" + +static napi_value Add(napi_env env, napi_callback_info info) +{ + size_t argc = 2; + napi_value args[2] = {nullptr}; + + napi_get_cb_info(env, info, &argc, args , nullptr, nullptr); + + napi_valuetype valuetype0; + napi_typeof(env, args[0], &valuetype0); + + napi_valuetype valuetype1; + napi_typeof(env, args[1], &valuetype1); + + double value0; + napi_get_value_double(env, args[0], &value0); + + double value1; + napi_get_value_double(env, args[1], &value1); + + napi_value sum; + napi_create_double(env, value0 + value1, &sum); + + return sum; + +} + +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + napi_property_descriptor desc[] = { + { "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr } + }; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "moduleb", + .nm_priv = ((void*)0), + .reserved = { 0 }, +}; + +extern "C" __attribute__((constructor)) void RegisterModulebModule(void) +{ + napi_module_register(&demoModule); +} diff --git a/Ndk/ndk1/Moduleb/src/main/cpp/types/libmoduleb/Index.d.ts b/Ndk/ndk1/Moduleb/src/main/cpp/types/libmoduleb/Index.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..e44f3615a4767c36b4fdc841b781af96bf1971a8 --- /dev/null +++ b/Ndk/ndk1/Moduleb/src/main/cpp/types/libmoduleb/Index.d.ts @@ -0,0 +1 @@ +export const add: (a: number, b: number) => number; \ No newline at end of file diff --git a/Ndk/ndk1/Moduleb/src/main/cpp/types/libmoduleb/oh-package.json5 b/Ndk/ndk1/Moduleb/src/main/cpp/types/libmoduleb/oh-package.json5 new file mode 100644 index 0000000000000000000000000000000000000000..d1efdf68131eb9098159ba5d53b1f6471aa743d3 --- /dev/null +++ b/Ndk/ndk1/Moduleb/src/main/cpp/types/libmoduleb/oh-package.json5 @@ -0,0 +1,6 @@ +{ + "name": "libmoduleb.so", + "types": "./Index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/Ndk/ndk1/Moduleb/src/main/ets/pages/Index.ets b/Ndk/ndk1/Moduleb/src/main/ets/pages/Index.ets new file mode 100644 index 0000000000000000000000000000000000000000..62b72003a64045373c578d50815f8691b7b0a44f --- /dev/null +++ b/Ndk/ndk1/Moduleb/src/main/ets/pages/Index.ets @@ -0,0 +1,26 @@ +import { hilog } from '@kit.PerformanceAnalysisKit'; +import testNapi from 'libmoduleb.so'; + +const DOMAIN = 0x0000; + +@Entry +@Component +struct Index { + @State message: string = 'Hello World'; + + build() { + Row() { + Column() { + Text(this.message) + .fontSize($r('app.float.page_text_font_size')) + .fontWeight(FontWeight.Bold) + .onClick(() => { + this.message = 'Welcome'; + hilog.info(DOMAIN, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(2, 3)); + }) + } + .width('100%') + } + .height('100%') + } +} \ No newline at end of file diff --git a/Ndk/ndk1/Moduleb/src/main/ets/utils/Calc.ets b/Ndk/ndk1/Moduleb/src/main/ets/utils/Calc.ets new file mode 100644 index 0000000000000000000000000000000000000000..08ab263da026007816dc1f175f5ebb19a989ec20 --- /dev/null +++ b/Ndk/ndk1/Moduleb/src/main/ets/utils/Calc.ets @@ -0,0 +1,3 @@ +export function add(a: number, b: number) { + return a + b; +} \ No newline at end of file diff --git a/Ndk/ndk1/Moduleb/src/main/module.json5 b/Ndk/ndk1/Moduleb/src/main/module.json5 new file mode 100644 index 0000000000000000000000000000000000000000..f677b9fe52eec47a02ff13e6c64278ec932833df --- /dev/null +++ b/Ndk/ndk1/Moduleb/src/main/module.json5 @@ -0,0 +1,14 @@ +{ + "module": { + "name": "Moduleb", + "type": "shared", + "description": "$string:shared_desc", + "deviceTypes": [ + "phone", + "tablet", + "2in1" + ], + "deliveryWithInstall": true, + "pages": "$profile:main_pages" + } +} \ No newline at end of file diff --git a/Ndk/ndk1/Moduleb/src/main/resources/base/element/float.json b/Ndk/ndk1/Moduleb/src/main/resources/base/element/float.json new file mode 100644 index 0000000000000000000000000000000000000000..33ea22304f9b1485b5f22d811023701b5d4e35b6 --- /dev/null +++ b/Ndk/ndk1/Moduleb/src/main/resources/base/element/float.json @@ -0,0 +1,8 @@ +{ + "float": [ + { + "name": "page_text_font_size", + "value": "50fp" + } + ] +} diff --git a/Ndk/ndk1/Moduleb/src/main/resources/base/element/string.json b/Ndk/ndk1/Moduleb/src/main/resources/base/element/string.json new file mode 100644 index 0000000000000000000000000000000000000000..98e1d8a84b3d8539ea33e79fe2ac593a05d23bb4 --- /dev/null +++ b/Ndk/ndk1/Moduleb/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "shared_desc", + "value": "description" + } + ] +} \ No newline at end of file diff --git a/Ndk/ndk1/Moduleb/src/main/resources/base/profile/main_pages.json b/Ndk/ndk1/Moduleb/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000000000000000000000000000000000000..1898d94f58d6128ab712be2c68acc7c98e9ab9ce --- /dev/null +++ b/Ndk/ndk1/Moduleb/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/Index" + ] +} diff --git a/Ndk/ndk1/Moduleb/src/ohosTest/ets/test/Ability.test.ets b/Ndk/ndk1/Moduleb/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..85c78f67579d6e31b5f5aeea463e216b9b141048 --- /dev/null +++ b/Ndk/ndk1/Moduleb/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,35 @@ +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/Ndk/ndk1/Moduleb/src/ohosTest/ets/test/List.test.ets b/Ndk/ndk1/Moduleb/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..794c7dc4ed66bd98fa3865e07922906e2fcef545 --- /dev/null +++ b/Ndk/ndk1/Moduleb/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,5 @@ +import abilityTest from './Ability.test'; + +export default function testsuite() { + abilityTest(); +} \ No newline at end of file diff --git a/Ndk/ndk1/Moduleb/src/ohosTest/module.json5 b/Ndk/ndk1/Moduleb/src/ohosTest/module.json5 new file mode 100644 index 0000000000000000000000000000000000000000..4633878648a71a22baa9fdae95d1b407ecf345b9 --- /dev/null +++ b/Ndk/ndk1/Moduleb/src/ohosTest/module.json5 @@ -0,0 +1,13 @@ +{ + "module": { + "name": "Moduleb_test", + "type": "feature", + "deviceTypes": [ + "phone", + "tablet", + "2in1" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} \ No newline at end of file diff --git a/Ndk/ndk1/Moduleb/src/test/List.test.ets b/Ndk/ndk1/Moduleb/src/test/List.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..bb5b5c3731e283dd507c847560ee59bde477bbc7 --- /dev/null +++ b/Ndk/ndk1/Moduleb/src/test/List.test.ets @@ -0,0 +1,5 @@ +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/Ndk/ndk1/Moduleb/src/test/LocalUnit.test.ets b/Ndk/ndk1/Moduleb/src/test/LocalUnit.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..165fc1615ee8618b4cb6a622f144a9a707eee99f --- /dev/null +++ b/Ndk/ndk1/Moduleb/src/test/LocalUnit.test.ets @@ -0,0 +1,33 @@ +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/Ndk/ndk1/build-profile.json5 b/Ndk/ndk1/build-profile.json5 index 1d0ce1691859051f9326bf58d9909cded5ab239c..a0e3ea41e08e22910d2e2d4214f2094849868844 100644 --- a/Ndk/ndk1/build-profile.json5 +++ b/Ndk/ndk1/build-profile.json5 @@ -108,6 +108,54 @@ ] } ] + }, + { + "name": "Modulea", + "srcPath": "./Modulea", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "Moduleb", + "srcPath": "./Moduleb", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "demoso", + "srcPath": "./demoso", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "IntegrateThirdPartySO1", + "srcPath": "./IntegrateThirdPartySO1", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] } ] } \ No newline at end of file diff --git a/Ndk/ndk1/cpplib/src/main/cpp/CMakeLists.txt b/Ndk/ndk1/cpplib/src/main/cpp/CMakeLists.txt index f310883034097a69bf5ac8f987f3db801597def8..0acfcd110518315e559f94fce1fff33cab141dc8 100644 --- a/Ndk/ndk1/cpplib/src/main/cpp/CMakeLists.txt +++ b/Ndk/ndk1/cpplib/src/main/cpp/CMakeLists.txt @@ -1,4 +1,8 @@ +# Native侧如何引入头文件deviceinfo.h # the minimum version of CMake. +# [Start device_info] +# CMakeLists.txt +# [StartExclude device_info] cmake_minimum_required(VERSION 3.5.0) project(ndk1) @@ -12,4 +16,6 @@ include_directories(${NATIVERENDER_ROOT_PATH} ${NATIVERENDER_ROOT_PATH}/include) add_library(cpplib SHARED hello.cpp NumberType.cpp) -target_link_libraries(cpplib PUBLIC libace_napi.z.so) \ No newline at end of file +# [EndExclude device_info] +target_link_libraries(cpplib PUBLIC libace_napi.z.so libdeviceinfo_ndk.z.so) +# [End device_info] \ No newline at end of file diff --git a/Ndk/ndk1/cpplib/src/main/cpp/include/Test.h b/Ndk/ndk1/cpplib/src/main/cpp/include/Test.h new file mode 100644 index 0000000000000000000000000000000000000000..82463a1e7445e4c65a7d8fdd88ec482da02eda9e --- /dev/null +++ b/Ndk/ndk1/cpplib/src/main/cpp/include/Test.h @@ -0,0 +1,10 @@ +// +// Created on 2025/5/29. +// +// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found, +// please include "napi/native_api.h". + +#ifndef NDK1_TEST_H +#define NDK1_TEST_H + +#endif //NDK1_TEST_H diff --git a/Ndk/ndk1/demoso/.gitignore b/Ndk/ndk1/demoso/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e2713a2779c5a3e0eb879efe6115455592caeea5 --- /dev/null +++ b/Ndk/ndk1/demoso/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/Ndk/ndk1/demoso/build-profile.json5 b/Ndk/ndk1/demoso/build-profile.json5 new file mode 100644 index 0000000000000000000000000000000000000000..38bdcc9929e2c5bd7f51c4fc96a398ccebd0d6ce --- /dev/null +++ b/Ndk/ndk1/demoso/build-profile.json5 @@ -0,0 +1,39 @@ +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "", + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + }, + "nativeLib": { + "debugSymbol": { + "strip": true, + "exclude": [] + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/Ndk/ndk1/demoso/hvigorfile.ts b/Ndk/ndk1/demoso/hvigorfile.ts new file mode 100644 index 0000000000000000000000000000000000000000..c6edcd90486dd5a853cf7d34c8647f08414ca7a3 --- /dev/null +++ b/Ndk/ndk1/demoso/hvigorfile.ts @@ -0,0 +1,6 @@ +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/Ndk/ndk1/demoso/libs/arm64-v8a/liba.so b/Ndk/ndk1/demoso/libs/arm64-v8a/liba.so new file mode 100644 index 0000000000000000000000000000000000000000..5f27b38f0379419e348777bc9eca33a8f02c22fd Binary files /dev/null and b/Ndk/ndk1/demoso/libs/arm64-v8a/liba.so differ diff --git a/Ndk/ndk1/demoso/libs/arm64-v8a/libb.so b/Ndk/ndk1/demoso/libs/arm64-v8a/libb.so new file mode 100644 index 0000000000000000000000000000000000000000..1af3f654573622d99f7ec74f41e3f04b2e920597 Binary files /dev/null and b/Ndk/ndk1/demoso/libs/arm64-v8a/libb.so differ diff --git a/Ndk/ndk1/demoso/obfuscation-rules.txt b/Ndk/ndk1/demoso/obfuscation-rules.txt new file mode 100644 index 0000000000000000000000000000000000000000..272efb6ca3f240859091bbbfc7c5802d52793b0b --- /dev/null +++ b/Ndk/ndk1/demoso/obfuscation-rules.txt @@ -0,0 +1,23 @@ +# Define project specific obfuscation rules here. +# You can include the obfuscation configuration files in the current module's build-profile.json5. +# +# For more details, see +# https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/source-obfuscation-V5 + +# Obfuscation options: +# -disable-obfuscation: disable all obfuscations +# -enable-property-obfuscation: obfuscate the property names +# -enable-toplevel-obfuscation: obfuscate the names in the global scope +# -compact: remove unnecessary blank spaces and all line feeds +# -remove-log: remove all console.* statements +# -print-namecache: print the name cache that contains the mapping from the old names to new names +# -apply-namecache: reuse the given cache file + +# Keep options: +# -keep-property-name: specifies property names that you want to keep +# -keep-global-name: specifies names that you want to keep in the global scope + +-enable-property-obfuscation +-enable-toplevel-obfuscation +-enable-filename-obfuscation +-enable-export-obfuscation \ No newline at end of file diff --git a/Ndk/ndk1/demoso/oh-package.json5 b/Ndk/ndk1/demoso/oh-package.json5 new file mode 100644 index 0000000000000000000000000000000000000000..1c33e5d7e4f2e958207d0b938259cc50a056f82c --- /dev/null +++ b/Ndk/ndk1/demoso/oh-package.json5 @@ -0,0 +1,11 @@ +{ + "name": "demoso", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": { + "libdemoso.so": "file:./src/main/cpp/types/libdemoso" + } +} \ No newline at end of file diff --git a/Ndk/ndk1/demoso/src/main/cpp/CMakeLists.txt b/Ndk/ndk1/demoso/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..5f1cbcf9cd9c1c837ef7a9ff01cd3d568f64252a --- /dev/null +++ b/Ndk/ndk1/demoso/src/main/cpp/CMakeLists.txt @@ -0,0 +1,13 @@ +# FAQ:多so相互依赖场景下如何解耦 +# [Start demo_so] +# CMakeLists.txt +cmake_minimum_required(VERSION 3.4.1) +project(DemoSO) +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include) +# Add libdemoso. so file +add_library(demoso SHARED hello.cpp) +# Add dependency libraries liba.so and libb.so. Please note to include the path, otherwise the corresponding SO library cannot be found +target_link_libraries(demoso PUBLIC libace_napi.z.so ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/liba.so ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libb.so) +# [End demo_so] \ No newline at end of file diff --git a/Ndk/ndk1/demoso/src/main/cpp/CMakeLists1.txt b/Ndk/ndk1/demoso/src/main/cpp/CMakeLists1.txt new file mode 100644 index 0000000000000000000000000000000000000000..671244a96776cb15c9a0e26c52f8fc99ec752c80 --- /dev/null +++ b/Ndk/ndk1/demoso/src/main/cpp/CMakeLists1.txt @@ -0,0 +1,13 @@ +# FAQ:多so相互依赖场景下如何解耦 +# [Start demo_so] +# CMakeLists.txt +cmake_minimum_required(VERSION 3.4.1) +project(liba) +# Compile library liba.so +add_library(a SHARED a.cpp) +target_link_libraries(a PUBLIC libace_napi.z.so libhilog_ndk.z.so) +project(libb) +# Compile library libb.so +add_library(b SHARED b.cpp) +target_link_libraries(b PUBLIC libace_napi.z.so libhilog_ndk.z.so) +# [End demo_so] \ No newline at end of file diff --git a/Ndk/ndk1/demoso/src/main/cpp/a.cpp b/Ndk/ndk1/demoso/src/main/cpp/a.cpp new file mode 100644 index 0000000000000000000000000000000000000000..fb5d3751f7d0624e3c2909d09b17059d2ba6990b --- /dev/null +++ b/Ndk/ndk1/demoso/src/main/cpp/a.cpp @@ -0,0 +1,28 @@ +// +// Created on 2025/5/29. +// +// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found, +// please include "napi/native_api.h". +/** + * FAQ:多so相互依赖场景下如何解耦 + */ +// [Start demo_so] +// a.cpp +extern "C" { // Be sure to enclose it with extern 'C' {} +#include "a.h" +#include +#include "stdio.h" +typedef int (*FUNC_SUB)(int, int); +int add(int a, int b) { return a + b; } +int getb(char *path, int a, int b) { // Path: The sandbox path for passing So files from ArkTS side (note that the path should be passed from ArkTS side, otherwise it may not be found, and the specific code will be listed later) + void *handle = dlopen(path, RTLD_LAZY); // Open the dynamic link library with path as path + if (!handle) { + return 0; + } + FUNC_SUB sub_func = (FUNC_SUB)dlsym(handle, "sub"); // Get the function named sub + int res = sub_func(a, b); // caller function + dlclose(handle); // Close dynamic link library + return res; +} +} +// [End demo_so] \ No newline at end of file diff --git a/Ndk/ndk1/demoso/src/main/cpp/a.h b/Ndk/ndk1/demoso/src/main/cpp/a.h new file mode 100644 index 0000000000000000000000000000000000000000..9aeec89e1568fccd6edf8d915ba7aa54c7e1ad2d --- /dev/null +++ b/Ndk/ndk1/demoso/src/main/cpp/a.h @@ -0,0 +1,18 @@ +// +// Created on 2025/5/29. +// +// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found, +// please include "napi/native_api.h". +/** + * FAQ:多so相互依赖场景下如何解耦 + */ +// [Start demo_so] +// a.h +extern "C" { +#ifndef DemoSO_a_H +#define DemoSO_a_H +int add(int a, int b); +int getb(char *path, int a, int b); +#endif // DemoSO_a_H +} +// [End demo_so] \ No newline at end of file diff --git a/Ndk/ndk1/demoso/src/main/cpp/b.cpp b/Ndk/ndk1/demoso/src/main/cpp/b.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6c383dbda179b043218325eaecb0a54d514954e5 --- /dev/null +++ b/Ndk/ndk1/demoso/src/main/cpp/b.cpp @@ -0,0 +1,28 @@ +// +// Created on 2025/5/29. +// +// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found, +// please include "napi/native_api.h". +/** + * FAQ:多so相互依赖场景下如何解耦 + */ +// [Start demo_so] +// b.cpp +extern "C" { // Be sure to enclose it with extern 'C' {} +#include "b.h" +#include +#include "stdio.h" +typedef int (*FUNC_ADD)(int, int); +int sub(int a, int b) { return a - b; } +int geta(char *path, int a, int b) { // Path: The sandbox path for passing So files from ArkTS side (note that the path should be passed from ArkTS side, otherwise it may not be found, and the specific code will be listed later) + void *handle = dlopen(path, RTLD_LAZY); // Open the dynamic link library with path as path + if (!handle) { + return 0; + } + FUNC_ADD add_func = (FUNC_ADD)dlsym(handle, "add"); // Get the function named sub + int res = add_func(a, b); // caller function + dlclose(handle); // Close dynamic link library + return res; +} +} +// [End demo_so] \ No newline at end of file diff --git a/Ndk/ndk1/demoso/src/main/cpp/b.h b/Ndk/ndk1/demoso/src/main/cpp/b.h new file mode 100644 index 0000000000000000000000000000000000000000..001f98eafb82a2fe117a93b8d0c0d7f1d6fc7503 --- /dev/null +++ b/Ndk/ndk1/demoso/src/main/cpp/b.h @@ -0,0 +1,18 @@ +// +// Created on 2025/5/29. +// +// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found, +// please include "napi/native_api.h". +/** + * FAQ:多so相互依赖场景下如何解耦 + */ +// [Start demo_so] +// b.h +extern "C" { +#ifndef DemoSO_b_H +#define DemoSO_b_H +int sub(int a, int b); +int geta(char *path, int a, int b); +#endif // DemoSO_b_H +} +// [End demo_so] \ No newline at end of file diff --git a/Ndk/ndk1/demoso/src/main/cpp/hello.cpp b/Ndk/ndk1/demoso/src/main/cpp/hello.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b1b6ca17ef08cde2dd6071a1b19372e2fede464d --- /dev/null +++ b/Ndk/ndk1/demoso/src/main/cpp/hello.cpp @@ -0,0 +1,75 @@ +/** + * FAQ:多so相互依赖场景下如何解耦 + */ +// [Start demo_so] +// hello.cpp +#include "a.h" +#include "b.h" +#include "napi/native_api.h" + +static napi_value Add(napi_env env, napi_callback_info info) { + size_t requireArgc = 3; + size_t argc = 3; + napi_value args[3] = {nullptr}; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + napi_valuetype valuetype0; + napi_typeof(env, args[0], &valuetype0); + napi_valuetype valuetype1; + napi_typeof(env, args[1], &valuetype1); + napi_valuetype valuetype2; + napi_typeof(env, args[2], &valuetype2); + int value0; + napi_get_value_int32(env, args[0], &value0); + int value1; + napi_get_value_int32(env, args[1], &value1); + char path[255]; + size_t size = 255; + napi_get_value_string_utf8(env, args[2], path, 255, &size); + int res = geta(path, value0, value1); // Call the function and pass the sandbox path + napi_value sum; + napi_create_int32(env, res, &sum); + return sum; +} +static napi_value Sub(napi_env env, napi_callback_info info) { + size_t requireArgc = 3; + size_t argc = 3; + napi_value args[3] = {nullptr}; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + napi_valuetype valuetype0; + napi_typeof(env, args[0], &valuetype0); + napi_valuetype valuetype1; + napi_typeof(env, args[1], &valuetype1); + napi_valuetype valuetype2; + napi_typeof(env, args[2], &valuetype2); + int value0; + napi_get_value_int32(env, args[0], &value0); + int value1; + napi_get_value_int32(env, args[1], &value1); + char path[255]; + size_t size = 255; + napi_get_value_string_utf8(env, args[2], path, 255, &size); + int res = getb(path, value0, value1); // Call the function and pass the sandbox path + napi_value sum; + napi_create_int32(env, res, &sum); + return sum; +} +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) { + napi_property_descriptor desc[] = {{"add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr}, + {"sub", nullptr, Sub, nullptr, nullptr, nullptr, napi_default, nullptr}}; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "demoso", + .nm_priv = ((void *)0), + .reserved = {0}, +}; +extern "C" __attribute__((constructor)) void RegisterDemosoModule(void) { napi_module_register(&demoModule); } +// [End demo_so] \ No newline at end of file diff --git a/Ndk/ndk1/demoso/src/main/cpp/types/libdemoso/Index.d.ts b/Ndk/ndk1/demoso/src/main/cpp/types/libdemoso/Index.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..9a36e4bae832655ecdd8ee4b64e202beefe5d041 --- /dev/null +++ b/Ndk/ndk1/demoso/src/main/cpp/types/libdemoso/Index.d.ts @@ -0,0 +1,8 @@ +/** + * FAQ:多so相互依赖场景下如何解耦 + */ +// [Start demo_so] +// index.d.ts +export const add: (a: number, b: number, path: string) => number; +export const sub: (a: number, b: number, path: string) => number; +// [End demo_so] \ No newline at end of file diff --git a/Ndk/ndk1/demoso/src/main/cpp/types/libdemoso/oh-package.json5 b/Ndk/ndk1/demoso/src/main/cpp/types/libdemoso/oh-package.json5 new file mode 100644 index 0000000000000000000000000000000000000000..6ba3183b07efc9fef6fe0865e2cb2b899c205c08 --- /dev/null +++ b/Ndk/ndk1/demoso/src/main/cpp/types/libdemoso/oh-package.json5 @@ -0,0 +1,6 @@ +{ + "name": "libdemoso.so", + "types": "./Index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/Ndk/ndk1/demoso/src/main/ets/demosoability/DemosoAbility.ets b/Ndk/ndk1/demoso/src/main/ets/demosoability/DemosoAbility.ets new file mode 100644 index 0000000000000000000000000000000000000000..d0dbe89588ea6436097aea1e554e77a833408d15 --- /dev/null +++ b/Ndk/ndk1/demoso/src/main/ets/demosoability/DemosoAbility.ets @@ -0,0 +1,43 @@ +import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +const DOMAIN = 0x0000; + +export default class DemosoAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err)); + return; + } + hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onBackground'); + } +} diff --git a/Ndk/ndk1/demoso/src/main/ets/pages/Index.ets b/Ndk/ndk1/demoso/src/main/ets/pages/Index.ets new file mode 100644 index 0000000000000000000000000000000000000000..b39e4000755b77d596e765070d19569b5fcf4647 --- /dev/null +++ b/Ndk/ndk1/demoso/src/main/ets/pages/Index.ets @@ -0,0 +1,32 @@ +/** + * FAQ:多so相互依赖场景下如何解耦 + */ +// [Start demo_so] +// index.ets +import testNapi from 'libdemoso.so'; +import { hilog } from '@kit.PerformanceAnalysisKit'; + +@Entry +@Component +struct Index { + @State message: string = 'Hello World'; + private path: string = ''; + + build() { + Row() { + Column() { + Text(this.message) + .fontSize(50) + .fontWeight(FontWeight.Bold) + .onClick(() => { + this.path = this.getUIContext().getHostContext()!.bundleCodeDir; // get path + hilog.info(0x0000, 'testTag', 'Test NAPI 5 + 3 = %{public}d', testNapi.add(5, 3, this.path + '/libs/arm64/liba.so')); // Call the native side function + hilog.info(0x0000, 'testTag', 'Test NAPI 5 - 3 = %{public}d', testNapi.sub(5, 3, this.path + '/libs/arm64/libb.so')); + }) + } + .width('100%') + } + .height('100%') + } +} +// [End demo_so] \ No newline at end of file diff --git a/Ndk/ndk1/demoso/src/main/module.json5 b/Ndk/ndk1/demoso/src/main/module.json5 new file mode 100644 index 0000000000000000000000000000000000000000..c90119958ddbe4bca84e08cc718d0df8cf826135 --- /dev/null +++ b/Ndk/ndk1/demoso/src/main/module.json5 @@ -0,0 +1,28 @@ +{ + "module": { + "name": "demoso", + "type": "feature", + "description": "$string:module_desc", + "mainElement": "DemosoAbility", + "deviceTypes": [ + "phone", + "tablet", + "2in1" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "DemosoAbility", + "srcEntry": "./ets/demosoability/DemosoAbility.ets", + "description": "$string:DemosoAbility_desc", + "icon": "$media:layered_image", + "label": "$string:DemosoAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true + } + ] + } +} \ No newline at end of file diff --git a/Ndk/ndk1/demoso/src/main/resources/base/element/color.json b/Ndk/ndk1/demoso/src/main/resources/base/element/color.json new file mode 100644 index 0000000000000000000000000000000000000000..3c712962da3c2751c2b9ddb53559afcbd2b54a02 --- /dev/null +++ b/Ndk/ndk1/demoso/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/Ndk/ndk1/demoso/src/main/resources/base/element/float.json b/Ndk/ndk1/demoso/src/main/resources/base/element/float.json new file mode 100644 index 0000000000000000000000000000000000000000..33ea22304f9b1485b5f22d811023701b5d4e35b6 --- /dev/null +++ b/Ndk/ndk1/demoso/src/main/resources/base/element/float.json @@ -0,0 +1,8 @@ +{ + "float": [ + { + "name": "page_text_font_size", + "value": "50fp" + } + ] +} diff --git a/Ndk/ndk1/demoso/src/main/resources/base/element/string.json b/Ndk/ndk1/demoso/src/main/resources/base/element/string.json new file mode 100644 index 0000000000000000000000000000000000000000..1a077b5f810da105f7bc3a1942e3c454edbf4d46 --- /dev/null +++ b/Ndk/ndk1/demoso/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "DemosoAbility_desc", + "value": "description" + }, + { + "name": "DemosoAbility_label", + "value": "label" + } + ] +} \ No newline at end of file diff --git a/Ndk/ndk1/demoso/src/main/resources/base/media/background.png b/Ndk/ndk1/demoso/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..923f2b3f27e915d6871871deea0420eb45ce102f Binary files /dev/null and b/Ndk/ndk1/demoso/src/main/resources/base/media/background.png differ diff --git a/Ndk/ndk1/demoso/src/main/resources/base/media/foreground.png b/Ndk/ndk1/demoso/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..97014d3e10e5ff511409c378cd4255713aecd85f Binary files /dev/null and b/Ndk/ndk1/demoso/src/main/resources/base/media/foreground.png differ diff --git a/Ndk/ndk1/demoso/src/main/resources/base/media/layered_image.json b/Ndk/ndk1/demoso/src/main/resources/base/media/layered_image.json new file mode 100644 index 0000000000000000000000000000000000000000..fb49920440fb4d246c82f9ada275e26123a2136a --- /dev/null +++ b/Ndk/ndk1/demoso/src/main/resources/base/media/layered_image.json @@ -0,0 +1,7 @@ +{ + "layered-image": + { + "background" : "$media:background", + "foreground" : "$media:foreground" + } +} \ No newline at end of file diff --git a/Ndk/ndk1/demoso/src/main/resources/base/media/startIcon.png b/Ndk/ndk1/demoso/src/main/resources/base/media/startIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..205ad8b5a8a42e8762fbe4899b8e5e31ce822b8b Binary files /dev/null and b/Ndk/ndk1/demoso/src/main/resources/base/media/startIcon.png differ diff --git a/Ndk/ndk1/demoso/src/main/resources/base/profile/main_pages.json b/Ndk/ndk1/demoso/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000000000000000000000000000000000000..1898d94f58d6128ab712be2c68acc7c98e9ab9ce --- /dev/null +++ b/Ndk/ndk1/demoso/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/Index" + ] +} diff --git a/Ndk/ndk1/demoso/src/mock/Libdemoso.mock.ets b/Ndk/ndk1/demoso/src/mock/Libdemoso.mock.ets new file mode 100644 index 0000000000000000000000000000000000000000..c2171716d040a605ef6af71e90b937a945f2677d --- /dev/null +++ b/Ndk/ndk1/demoso/src/mock/Libdemoso.mock.ets @@ -0,0 +1,7 @@ +const NativeMock: Record = { + 'add': (a: number, b: number) => { + return a + b; + }, +}; + +export default NativeMock; \ No newline at end of file diff --git a/Ndk/ndk1/demoso/src/mock/mock-config.json5 b/Ndk/ndk1/demoso/src/mock/mock-config.json5 new file mode 100644 index 0000000000000000000000000000000000000000..ba61d264e24767ad77271bf17a99cd6f3a05a494 --- /dev/null +++ b/Ndk/ndk1/demoso/src/mock/mock-config.json5 @@ -0,0 +1,5 @@ +{ + "libdemoso.so": { + "source": "src/mock/Libdemoso.mock.ets" + } +} \ No newline at end of file diff --git a/Ndk/ndk1/demoso/src/ohosTest/ets/test/Ability.test.ets b/Ndk/ndk1/demoso/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..85c78f67579d6e31b5f5aeea463e216b9b141048 --- /dev/null +++ b/Ndk/ndk1/demoso/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,35 @@ +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/Ndk/ndk1/demoso/src/ohosTest/ets/test/List.test.ets b/Ndk/ndk1/demoso/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..794c7dc4ed66bd98fa3865e07922906e2fcef545 --- /dev/null +++ b/Ndk/ndk1/demoso/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,5 @@ +import abilityTest from './Ability.test'; + +export default function testsuite() { + abilityTest(); +} \ No newline at end of file diff --git a/Ndk/ndk1/demoso/src/ohosTest/module.json5 b/Ndk/ndk1/demoso/src/ohosTest/module.json5 new file mode 100644 index 0000000000000000000000000000000000000000..3229753c44ff5449b511f07d29ef8b1110ecf045 --- /dev/null +++ b/Ndk/ndk1/demoso/src/ohosTest/module.json5 @@ -0,0 +1,13 @@ +{ + "module": { + "name": "demoso_test", + "type": "feature", + "deviceTypes": [ + "phone", + "tablet", + "2in1" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/Ndk/ndk1/demoso/src/test/List.test.ets b/Ndk/ndk1/demoso/src/test/List.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..bb5b5c3731e283dd507c847560ee59bde477bbc7 --- /dev/null +++ b/Ndk/ndk1/demoso/src/test/List.test.ets @@ -0,0 +1,5 @@ +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/Ndk/ndk1/demoso/src/test/LocalUnit.test.ets b/Ndk/ndk1/demoso/src/test/LocalUnit.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..165fc1615ee8618b4cb6a622f144a9a707eee99f --- /dev/null +++ b/Ndk/ndk1/demoso/src/test/LocalUnit.test.ets @@ -0,0 +1,33 @@ +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/Ndk/ndk1/entry/src/main/cpp/TestDemo.cpp b/Ndk/ndk1/entry/src/main/cpp/TestDemo.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1d36ef81da3ba9b198e8c2389fcbb6737f5a6e37 --- /dev/null +++ b/Ndk/ndk1/entry/src/main/cpp/TestDemo.cpp @@ -0,0 +1,26 @@ +// +// Created on 2025/5/29. +// +// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found, +// please include "napi/native_api.h". +/** + * FAQ:如何在Native侧释放ArkTS对象 + */ +#include "napi/native_api.h" + +void Test(napi_env env, napi_callback_info info) { + napi_value jsobject; + void* nativeObject; + napi_finalize cb; + // [Start napi_wrap] + // Usage 1: Napi_rap does not need to receive the created napi_ref, and the last parameter is passed as nulliptr. The created napi_ref is a weak reference, managed by the system, and does not require manual release by the user + napi_wrap(env, jsobject, nativeObject, cb, nullptr, nullptr); + + // Usage 2: napi_rap needs to receive the created napi_ref, the last parameter is not null ptr, and the returned napi_ref is a strong reference that needs to be manually released by the user, otherwise it will cause memory leakage + napi_ref result; + napi_wrap(env, jsobject, nativeObject, cb, nullptr, &result); + // When jsobject and result are no longer used in the future, promptly call napi_remove-wrap to release result + void** result1; + napi_remove_wrap(env, jsobject, result1); + // [End napi_wrap] +} \ No newline at end of file diff --git a/Ndk/ndk1/entry/src/main/cpp/napi_init.cpp b/Ndk/ndk1/entry/src/main/cpp/napi_init.cpp index f2bdfcdd9e5df0a749d044f810d5d3b68a307539..c56524fd4f10b62f8bfa8589dc05dab2ba4ac635 100644 --- a/Ndk/ndk1/entry/src/main/cpp/napi_init.cpp +++ b/Ndk/ndk1/entry/src/main/cpp/napi_init.cpp @@ -2,7 +2,17 @@ #include "NativeMap/NativeMap.h" #include "Test/Test.h" #include "TsFCallback/TsFCallback.h" +#include +/** + * FAQ:Native侧如何打印char指针 + */ +void TestLog() { + // [Start log_char] + char *path = "abc"; + OH_LOG_INFO(LOG_APP, "path: %{public}s", path); + // [End log_char] +} static napi_value Add(napi_env env, napi_callback_info info) { size_t argc = 2; diff --git a/Ndk/ndk1/log.txt b/Ndk/ndk1/log.txt index cb26ea063da5f1c116a400faef74812ab84dff5d..308cabe4ee97238985758c0f41e22196ac09aa6d 100644 --- a/Ndk/ndk1/log.txt +++ b/Ndk/ndk1/log.txt @@ -597,3 +597,261 @@ 14:30:34:741 log after task size: 0 14:30:35:247 log timer task size: 1 16:35:44:269 log timer task size: 1 +14:58:13:792 log timer task size: 1 +14:58:42:916 log task queue not empty +14:58:42:916 log task size: 1 +14:58:42:916 log before pop task size: 1 +14:58:42:916 log after task size: 0 +14:58:43:423 log timer task size: 1 +14:58:45:715 log task queue not empty +14:58:45:715 log task size: 1 +14:58:45:715 log before pop task size: 1 +14:58:45:715 log after task size: 0 +14:58:46:225 log timer task size: 1 +15:08:53:586 log task queue not empty +15:08:53:587 log task size: 1 +15:08:53:587 log before pop task size: 1 +15:08:53:587 log after task size: 0 +15:08:54:098 log timer task size: 1 +15:09:00:098 log task queue not empty +15:09:00:099 log task size: 1 +15:09:00:099 log before pop task size: 1 +15:09:00:099 log after task size: 0 +15:09:00:291 log task queue not empty +15:09:00:291 log task size: 1 +15:09:00:291 log before pop task size: 1 +15:09:00:291 log after task size: 0 +15:09:00:604 log timer task size: 1 +15:09:00:795 log timer task size: 1 +15:09:01:372 log task queue not empty +15:09:01:372 log task size: 1 +15:09:01:372 log before pop task size: 1 +15:09:01:372 log after task size: 0 +15:09:01:875 log timer task size: 1 +15:09:02:519 log task queue not empty +15:09:02:519 log task size: 1 +15:09:02:519 log before pop task size: 1 +15:09:02:520 log after task size: 0 +15:09:03:033 log timer task size: 1 +15:10:33:595 log task queue not empty +15:10:33:595 log task size: 1 +15:10:33:595 log before pop task size: 1 +15:10:33:595 log after task size: 0 +15:10:33:786 log task queue not empty +15:10:33:786 log task size: 1 +15:10:33:787 log before pop task size: 1 +15:10:33:787 log after task size: 0 +15:10:34:097 log timer task size: 1 +15:10:34:287 log timer task size: 1 +15:10:40:010 log task queue not empty +15:10:40:010 log task size: 1 +15:10:40:010 log before pop task size: 1 +15:10:40:011 log after task size: 0 +15:10:40:217 log task queue not empty +15:10:40:217 log task size: 1 +15:10:40:217 log before pop task size: 1 +15:10:40:217 log after task size: 0 +15:10:40:518 log timer task size: 1 +15:10:40:724 log timer task size: 1 +15:44:37:092 log task queue not empty +15:44:37:094 log task size: 1 +15:44:37:094 log before pop task size: 1 +15:44:37:094 log after task size: 0 +15:44:37:610 log timer task size: 1 +15:46:27:811 log task queue not empty +15:46:27:811 log task size: 1 +15:46:27:811 log before pop task size: 1 +15:46:27:811 log after task size: 0 +15:46:28:320 log timer task size: 1 +15:46:29:002 log task queue not empty +15:46:29:002 log task size: 1 +15:46:29:002 log before pop task size: 1 +15:46:29:002 log after task size: 0 +15:46:29:146 log task queue not empty +15:46:29:146 log task size: 1 +15:46:29:146 log before pop task size: 1 +15:46:29:146 log after task size: 0 +15:46:29:513 log timer task size: 1 +15:46:29:655 log timer task size: 1 +15:46:29:811 log task queue not empty +15:46:29:811 log task size: 1 +15:46:29:811 log before pop task size: 1 +15:46:29:811 log after task size: 0 +15:46:29:815 log task queue not empty +15:46:29:815 log task size: 1 +15:46:29:815 log before pop task size: 1 +15:46:29:815 log after task size: 0 +15:46:29:819 log task queue not empty +15:46:29:819 log task size: 1 +15:46:29:819 log before pop task size: 1 +15:46:29:819 log after task size: 0 +15:46:30:187 log task queue not empty +15:46:30:188 log task size: 1 +15:46:30:188 log before pop task size: 1 +15:46:30:188 log after task size: 0 +15:46:30:317 log timer task size: 1 +15:46:30:333 log timer task size: 1 +15:46:30:700 log timer task size: 1 +15:46:30:889 log task queue not empty +15:46:30:890 log task size: 1 +15:46:30:890 log before pop task size: 1 +15:46:30:890 log after task size: 0 +15:46:31:401 log timer task size: 1 +15:46:31:642 log task queue not empty +15:46:31:642 log task size: 1 +15:46:31:642 log before pop task size: 1 +15:46:31:643 log after task size: 0 +15:46:31:857 log task queue not empty +15:46:31:857 log task size: 1 +15:46:31:857 log before pop task size: 1 +15:46:31:857 log after task size: 0 +15:46:32:098 log task queue not empty +15:46:32:098 log task size: 1 +15:46:32:098 log before pop task size: 1 +15:46:32:098 log after task size: 0 +15:46:32:148 log timer task size: 1 +15:46:32:371 log timer task size: 1 +15:46:32:445 log task queue not empty +15:46:32:445 log task size: 1 +15:46:32:445 log before pop task size: 1 +15:46:32:446 log after task size: 0 +15:46:32:610 log timer task size: 1 +15:46:32:956 log timer task size: 1 +15:46:32:987 log task queue not empty +15:46:32:988 log task size: 1 +15:46:32:988 log before pop task size: 1 +15:46:32:988 log after task size: 0 +15:46:33:498 log timer task size: 1 +15:46:37:218 log task queue not empty +15:46:37:218 log task size: 1 +15:46:37:219 log before pop task size: 1 +15:46:37:219 log after task size: 0 +15:46:37:225 log task queue not empty +15:46:37:225 log task size: 1 +15:46:37:226 log before pop task size: 1 +15:46:37:226 log after task size: 0 +15:46:37:490 log task queue not empty +15:46:37:490 log task size: 1 +15:46:37:490 log before pop task size: 1 +15:46:37:490 log after task size: 0 +15:46:37:494 log task queue not empty +15:46:37:494 log task size: 1 +15:46:37:494 log before pop task size: 1 +15:46:37:494 log after task size: 0 +15:46:37:732 log timer task size: 1 +15:46:38:004 log timer task size: 1 +15:46:38:710 log task queue not empty +15:46:38:710 log task size: 1 +15:46:38:710 log before pop task size: 1 +15:46:38:710 log after task size: 0 +15:46:38:948 log task queue not empty +15:46:38:948 log task size: 1 +15:46:38:948 log before pop task size: 1 +15:46:38:948 log after task size: 0 +15:46:39:105 log task queue not empty +15:46:39:105 log task size: 1 +15:46:39:105 log before pop task size: 1 +15:46:39:106 log after task size: 0 +15:46:39:214 log timer task size: 1 +15:46:39:257 log task queue not empty +15:46:39:258 log task size: 1 +15:46:39:258 log before pop task size: 1 +15:46:39:258 log after task size: 0 +15:46:39:448 log task queue not empty +15:46:39:449 log task size: 1 +15:46:39:449 log before pop task size: 1 +15:46:39:449 log after task size: 0 +15:46:39:453 log timer task size: 1 +15:46:39:613 log timer task size: 1 +15:46:39:773 log timer task size: 1 +15:46:39:962 log timer task size: 1 +15:46:40:400 log task queue not empty +15:46:40:400 log task size: 1 +15:46:40:400 log before pop task size: 1 +15:46:40:400 log after task size: 0 +15:46:40:916 log timer task size: 1 +15:46:55:753 log task queue not empty +15:46:55:753 log task size: 1 +15:46:55:754 log before pop task size: 1 +15:46:55:754 log after task size: 0 +15:46:56:266 log timer task size: 1 +15:46:57:515 log task queue not empty +15:46:57:515 log task size: 1 +15:46:57:515 log before pop task size: 1 +15:46:57:515 log after task size: 0 +15:46:57:867 log task queue not empty +15:46:57:867 log task size: 1 +15:46:57:867 log before pop task size: 1 +15:46:57:867 log after task size: 0 +15:46:58:025 log timer task size: 1 +15:46:58:161 log task queue not empty +15:46:58:161 log task size: 1 +15:46:58:161 log before pop task size: 1 +15:46:58:161 log after task size: 0 +15:46:58:374 log timer task size: 1 +15:46:58:677 log timer task size: 1 +15:46:59:986 log task queue not empty +15:46:59:986 log task size: 1 +15:46:59:986 log before pop task size: 1 +15:46:59:986 log after task size: 0 +15:47:00:501 log timer task size: 1 +15:47:01:707 log task queue not empty +15:47:01:707 log task size: 1 +15:47:01:707 log before pop task size: 1 +15:47:01:707 log after task size: 0 +15:47:02:212 log timer task size: 1 +15:47:04:729 log task queue not empty +15:47:04:729 log task size: 1 +15:47:04:729 log before pop task size: 1 +15:47:04:730 log after task size: 0 +15:47:05:237 log timer task size: 1 +15:47:05:803 log task queue not empty +15:47:05:803 log task size: 1 +15:47:05:803 log before pop task size: 1 +15:47:05:803 log after task size: 0 +15:47:05:945 log task queue not empty +15:47:05:945 log task size: 1 +15:47:05:945 log before pop task size: 1 +15:47:05:945 log after task size: 0 +15:47:06:107 log task queue not empty +15:47:06:107 log task size: 1 +15:47:06:107 log before pop task size: 1 +15:47:06:107 log after task size: 0 +15:47:06:316 log timer task size: 1 +15:47:06:459 log timer task size: 1 +15:47:06:619 log timer task size: 1 +15:47:06:810 log task queue not empty +15:47:06:810 log task size: 1 +15:47:06:810 log before pop task size: 1 +15:47:06:810 log after task size: 0 +15:47:07:315 log timer task size: 1 +15:47:07:874 log task queue not empty +15:47:07:874 log task size: 1 +15:47:07:874 log before pop task size: 1 +15:47:07:874 log after task size: 0 +15:47:08:146 log task queue not empty +15:47:08:146 log task size: 1 +15:47:08:146 log before pop task size: 1 +15:47:08:146 log after task size: 0 +15:47:08:308 log task queue not empty +15:47:08:308 log task size: 1 +15:47:08:308 log before pop task size: 1 +15:47:08:308 log after task size: 0 +15:47:08:380 log timer task size: 1 +15:47:08:651 log timer task size: 1 +15:47:08:811 log timer task size: 1 +15:47:08:970 log task queue not empty +15:47:08:971 log task size: 1 +15:47:08:971 log before pop task size: 1 +15:47:08:971 log after task size: 0 +15:47:09:388 log task queue not empty +15:47:09:388 log task size: 1 +15:47:09:388 log before pop task size: 1 +15:47:09:388 log after task size: 0 +15:47:09:478 log timer task size: 1 +15:47:09:729 log task queue not empty +15:47:09:729 log task size: 1 +15:47:09:729 log before pop task size: 1 +15:47:09:729 log after task size: 0 +15:47:09:893 log timer task size: 1 +15:47:10:241 log timer task size: 1 diff --git a/Ndk/ndk1/nativeClass/src/main/cpp/hello.cpp b/Ndk/ndk1/nativeClass/src/main/cpp/hello.cpp index 6df6c68de2995cc7f5a0fedc49a2a263c3f52bef..9ff6efb9c3bfd6d797f2bf2828043b4987a3d388 100644 --- a/Ndk/ndk1/nativeClass/src/main/cpp/hello.cpp +++ b/Ndk/ndk1/nativeClass/src/main/cpp/hello.cpp @@ -5,16 +5,6 @@ #include "napi/native_api.h" #include #include "MyDemo.h" -//#include -//class MyDemo { -// public: -// MyDemo(std::string m_name); -// MyDemo(); -// ~MyDemo(); -// std::string name; -// int add(int a, int b); -// int sub(int a, int b); -//}; // [Start native_class_cpp] // ArkTS Object Constructor static napi_value JsConstructor(napi_env env, napi_callback_info info) {