C++调用ArkTS 定义的方法

C++调用ArkTS 定义的方法

HarmonyOS
2024-05-23 21:42:02
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
躺平嗑产品懒猫
1

一、目的

C++调用ArkTS 定义的一个方法

二、方案

1. 传入实例对象,在C++侧调用对象中的函数。

2. 使用全局对象,调用artTS内函数。(ets限制globalThis使用,将函数写在ts文件中)

三、待调用函数定义

User.ts

export default class User { 
  name: string = 'username' 
  
  location: object = { 
    country: 'china', 
    city: 'wuhan' 
  } 
  
  onCall() { 
    console.log("testTag user onCall") 
  } 
  
} 
  
function onCallGlobal() { 
  console.log("testTag user onCall Global") 
} 
globalThis.onCallGlobal = onCallGlobal;

四、传入实例对象调用

 // 传入实例对象,在C++侧调用对象中的函数 
static napi_value CallFunction(napi_env env, napi_callback_info info)  
{ 
    // 获取实例对象 
    size_t argc = 1; 
    napi_value args = nullptr; 
    napi_get_cb_info(env, info, &argc, &args, NULL, NULL); 
  
    // 获取对象的方法 
    napi_value onCall; 
    napi_status status = napi_get_named_property(env, args, "onCall", &onCall); 
    if (status != napi_ok) 
        return onCall; 
    napi_value return_val; 
     
    // 调用对象中的函数 
    status = napi_call_function(env, args, onCall, 0, NULL, &return_val); 
    return onCall; 
}

五、使用全局对象调用

// 使用全局对象,调用TS内函数 
static napi_value CallFunction_global(napi_env env, napi_callback_info info)  
{ 
    // 获取全局对象 
    napi_value global; 
    napi_status status = napi_get_global(env, &global); 
     
    // 获取onCallGlobal函数 
    napi_value onCall; 
    status = napi_get_named_property(env, global, "onCallGlobal", &onCall); 
    if (status != napi_ok) 
        return global; 
    napi_value return_val; 
    status = napi_call_function(env, global, onCall, 0, NULL, &return_val); 
    return onCall; 
}

六、index.d.ts与ArkTS 层

index.d.ts

export const CallFunction_global: () => void; 
export const CallFunction: (value: Object) => void; 

index.ets

import testNapi from 'libentry.so'; 
import User from '../classes/User'; 
  
@Entry 
@Component 
struct Index { 
  @State message: string = 'Hello World'; 
  
  build() { 
    Row() { 
      Column() { 
        Text(this.message) 
          .fontSize(50) 
          .fontWeight(FontWeight.Bold) 
          .onClick(() => { 
            let user:User = new User(); 
            testNapi.CallFunction(user); 
            testNapi.CallFunction_global(); 
          }) 
      } 
      .width('100%') 
    } 
    .height('100%') 
  } 
} 

七、运行结果

分享
微博
QQ
微信
回复
2024-05-24 17:02:35
相关问题
c/c++层主动调用ArkTS存在问题
380浏览 • 1回复 待解决
ArkTSC++互相直接调用
2269浏览 • 1回复 待解决
ArkTS调用C++类中成员函数
1312浏览 • 1回复 待解决
c++中实例化自定义类并调用方法
336浏览 • 1回复 待解决
C++同步调ArkTS里面的方法
1134浏览 • 1回复 待解决
c++侧可以直接调用tsstatic方法吗?
2151浏览 • 1回复 待解决
HarmonyOS ArkTSC/C++交互
747浏览 • 1回复 待解决
HarmonyOS ArkTSC++ 偶现方法找不到。
533浏览 • 1回复 待解决
如何在C/C++ 创建ArkTS对象
2220浏览 • 1回复 待解决
ArkTSC++之间交互
1426浏览 • 1回复 待解决
如何实现ArkTSC/C++数组转换
752浏览 • 1回复 待解决
如何实现ArkTSC/C++HashMap转换?
1138浏览 • 0回复 待解决
如何实现ArkTSC/C++对象传递
670浏览 • 1回复 待解决
HarmonyOS 如何调用标准C++
465浏览 • 1回复 待解决