C++ 模块扩展

我们将以 TestModule 为例,从头扩展一个 Module,这个 Module 将展示前端如何调用终端能力,并且把结果返回给前端。

继承 ModuleBase

core/modules/ 下创建 test-module.h

  1. #ifndef CORE_MODULES_TEST_MODULE_H_
  2. #define CORE_MODULES_TEST_MODULE_H_
  3. #include "core/modules/module-base.h"
  4. #include "core/napi/callback-info.h"
  5. class TestModule : public ModuleBase {
  6. public:
  7. explicit TestModule(hippy::napi::napi_context context){};
  8. void RetStr(const hippy::napi::CallbackInfo& info);
  9. void Print(const hippy::napi::CallbackInfo& info);
  10. };
  11. #endif // CORE_MODULES_TEST_MODULE_H_

core/modules/ 下创建 test-module.cc

  1. #include "core/modules/module-register.h"
  2. #include "core/modules/test-module.h"
  3. #include "core/napi/js-native-api.h"
  4. #include "core/base/logging.h"
  5. REGISTER_MODULE(TestModule, RetStr)
  6. REGISTER_MODULE(TestModule, Print)
  7. void TestModule::RetStr(const hippy::napi::CallbackInfo& info) {
  8. std::shared_ptr<Environment> env = info.GetEnv();
  9. hippy::napi::napi_context context = env->getContext();
  10. HIPPY_CHECK(context);
  11. info.GetReturnValue()->Set(hippy::napi::napi_create_string(context, "hello world"));
  12. }
  13. void TestModule::Print(const hippy::napi::CallbackInfo& info) {
  14. std::shared_ptr<Environment> env = info.GetEnv();
  15. hippy::napi::napi_context context = env->getContext();
  16. HIPPY_CHECK(context);
  17. HIPPY_LOG(hippy::Debug, "hello world");
  18. info.GetReturnValue()->SetUndefined();
  19. }

JS 桥接

双平台通用模块一般放在 core/js/global 下,我们在 global 下 增加 TestModule.js

  1. const TestModule = internalBinding('TestModule');
  2. global.TestModule = TestModule;

core/js/entry/ 下双平台 hippy.js 里增加

  1. require('../../global/TestModule.js');

在 Hippy 目录下运行 npm run buildcore,会生成对应双平台的 C++ 源代码:

重新编译 Core

无需做别的改动,重新编译终端 SDK 即可,终端 SDK 能够链接到 core 目录中的对应 C++ 代码,需要注意 Android 需要准备好 cmake、ndk 等等编译环境。

效果

  1. global.TestModule.Print();
  2. global.TestModule.RetStr();
  3. 2019-11-08 17:32:57.630 7004-7066/? D/HippyCore: hello world