C++调用ArkTS 定义的方法

C++调用ArkTS 定义的方法

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

一、目的

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
相关问题
ArkTSC++互相直接调用
453浏览 • 1回复 待解决
ArkTS调用C++类中成员函数
469浏览 • 1回复 待解决
C++同步调ArkTS里面的方法
361浏览 • 1回复 待解决
c++侧可以直接调用tsstatic方法吗?
585浏览 • 1回复 待解决
如何在C/C++ 创建ArkTS对象
709浏览 • 1回复 待解决
ArkTSC++之间交互
383浏览 • 1回复 待解决
如何实现ArkTSC/C++HashMap转换?
361浏览 • 0回复 待解决
C++ 如何获取操作 Arkts 实例
388浏览 • 1回复 待解决
C++native方法能否直接导出
656浏览 • 1回复 待解决
ArkTS对象绑定C++对象如何回收?
348浏览 • 1回复 待解决
通过Native 调用c++层实现文本绘制
442浏览 • 1回复 待解决
HAR中C++编写sonative方法使用
283浏览 • 1回复 待解决
如何修改C++版本?C++支持情况?
309浏览 • 1回复 待解决