NAPI中定义并注册Class

在native中使用class

HarmonyOS
2024-05-23 21:48:56
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
kaijunx

使用的核心API

核心代码解释

  • ThirdUserApiNapi.h
#ifndef NATIVE_TEST_NAPITEST_H 
#define NATIVE_TEST_NAPITEST_H 
  
#include "napi/native_api.h" 
#include <string> 
  
class ThirdUserApiNapi { 
public: 
        static napi_value Login(napi_env env, napi_callback_info info); 
        static napi_value Uid(napi_env env, napi_callback_info info); 
}; 
  
#endif //NATIVE_TEST_NAPITEST_H
  • ThirdUserApiNapi.cpp
#include "ThirdUserApiNapi.h" 
  
napi_value ThirdUserApiNapi::Login(napi_env env, napi_callback_info info) { 
    napi_value sum; 
    napi_create_double(env, 10, &sum); 
    return sum; 
} 
  
napi_value ThirdUserApiNapi::Uid(napi_env env, napi_callback_info info) { 
    napi_value sum; 
    napi_create_double(env, 5, &sum); 
    return sum; 
}
  •  napi_init.cpp
static napi_value JsConstructor(napi_env env, napi_callback_info info) { 
    // 创建napi对象 
    napi_value jDemo = nullptr; 
     
    // 创建C++对象 
    ThirdUserApiNapi *cDemo = new ThirdUserApiNapi(); 
  
    // 绑定JS对象与C++对象 
    napi_wrap( 
        env, jDemo, cDemo, 
        // 定义js对象回收时回调函数,用来销毁C++对象,防止内存泄漏 
        [](napi_env env, void *finalize_data, void *finalize_hint) { 
            ThirdUserApiNapi *cDemo = (ThirdUserApiNapi *)finalize_data; 
            delete cDemo; 
            cDemo = nullptr; 
        }, 
        nullptr, nullptr); 
    return jDemo; 
} 
  
  
EXTERN_C_START 
static napi_value Init(napi_env env, napi_value exports) 
{ 
    napi_property_descriptor desc[] = { 
        {"_Login", nullptr, ThirdUserApiNapi::Login, nullptr, nullptr, nullptr, napi_static, nullptr }, 
        {"_Uid", nullptr, ThirdUserApiNapi::Login, nullptr, nullptr, nullptr, napi_static, nullptr} 
    }; 
     
    const char className[] = "ThirdUserApiNapi"; 
    napi_value ThirdUserApiNapiClass = nullptr; 
    napi_define_class(env, className, sizeof(className), JsConstructor, nullptr,  
        sizeof(desc) / sizeof(desc[0]), desc, &ThirdUserApiNapiClass); 
    napi_set_named_property(env, exports, className, ThirdUserApiNapiClass); 
    return exports; 
} 
EXTERN_C_END
  • Index.d.ts
export declare class ThirdUserApiNapi { 
  static _Login(a: string): number 
  static _Uid(): number 
}
  • Index.ets
import { ThirdUserApiNapi } from 'libentry.so' 
  
@Entry 
@Component 
struct Index { 
  @State message: string = 'Hello World'; 
  
  build() { 
    Row() { 
      Column() { 
        Text(this.message) 
          .fontSize(50) 
          .fontWeight(FontWeight.Bold) 
          .onClick(() => { 
            console.warn('result = ', ThirdUserApiNapi._Login('')); 
          }) 
      } 
      .width('100%') 
    } 
    .height('100%') 
  } 
}

实现效果

注明适配的版本信息

IDE版本:4.1.3.700

SDK版本:API11

分享
微博
QQ
微信
回复
2024-05-24 21:09:28
相关问题
napi常见用法:class对象绑定
460浏览 • 1回复 待解决
注册的自定义字体在 webview 无效
867浏览 • 1回复 待解决
Native与TS互传自定义obj class
500浏览 • 1回复 待解决
openHarmony 注册服务的语法问题
5691浏览 • 1回复 待解决
json字符串与自定义class结构的转换
654浏览 • 1回复 待解决
求js class类名动态绑定的问题?
5227浏览 • 1回复 待解决
class二次刷新渲染数组
335浏览 • 1回复 待解决
鸿蒙js开发登录注册问题
4815浏览 • 2回复 待解决