HarmonyOS ArkTS如何调C++的api,或C++如何调用ArkTS的api

HarmonyOS
2天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Excelsior_abit

尝试下如下方案

https://gitee.com/openharmony-sig/aki

代码参考:

//1.TypeScript 接口定义:
// types.ts

export interface MyInterface {
  notify(message: string): void;
}
//2.将 TypeScript 接口传递给 C++:
// index.ts
import { MyInterface } from ‘./types’;
const ffi = require(‘ffi-napi’);

const myLibrary = ffi.Library(‘path/to/myCppLibrary’, {
  ‘callNotify’: [‘void’, [‘pointer’, ‘string’]]
});

const myInterface: MyInterface = {
  notify: (message: string) => {
    myLibrary.callNotify(null, message);
  }
};

export { myInterface };
//3.C++ 调用 TypeScript 方法
// myCppLibrary.cpp
extern “C” {
  typedef void(notifyFunc)(const char);

  void callNotify(notifyFunc func, const char* message) {
    // 这里是调用 TypeScript 方法的逻辑
    if (func != nullptr) {
      func(message);
    }
  }
}

可以用函数指针数组的方式来处理这种情况 不需要传递大量单独的函数指针

先在 TypeScript 中定义一个包含多个方法的接口和相应的实现类

// MyNativeModule.ts
declare function nativeRegisterCallback(callback: number): void;

interface MyCallback {
  method1(): void;
  method2(): void;
  // 定义更多方法…
}

class MyCallbackImpl implements MyCallback {
  method1(): void {
    console.log(“Method 1 called”);
  }

  method2(): void {
    console.log(“Method 2 called”);
  }
  // 实现更多方法…
}

const callbackImpl = new MyCallbackImpl();
nativeRegisterCallback(callbackImpl);

然后在 C++ 中使用函数指针数组来处理多个方法的回调

// MyCallback.h
#ifndef MYCALLBACK_H
#define MYCALLBACK_H
class MyCallback {
  public:
    virtual void method1() = 0;
  virtual void method2() = 0;
  // 声明更多方法…
};

typedef void (*MethodCallback)();

class MyCallbackWrapper {
  public:
    MethodCallback methods[10]; // 假设有10个方法

  void callMethod(int index) {
  if (methods[index] != nullptr) {
  methodsindex;
}
}
};

#endif // MYCALLBACK_H

  / MyNativeModule.cpp
#include “MyCallback.h”
MyCallbackWrapper* globalCallback = nullptr;

extern “C” {

  JNIEXPORT void JNICALL Java_com_example_MyNativeModule_registerCallback(JNIEnv env, jobject thiz, jlong nativePtr) {
    globalCallback = reinterpret_cast<MyCallbackWrapper>(nativePtr);
  }

  JNIEXPORT void JNICALL Java_com_example_MyNativeModule_callMethod(JNIEnv *env, jobject thiz, jint index) {
    if (globalCallback != nullptr) {
      globalCallback->callMethod(index);
    }
  }

} // extern “C”

通过 MyCallbackWrapper 类和 methods 数组来存储多个方法的函数指针。在 callMethod 方法中,根据传入的索引调用对应的方法

分享
微博
QQ
微信
回复
2天前
相关问题
C++调用ArkTS 定义方法
2060浏览 • 1回复 待解决
如何C/C++ 创建ArkTS对象
2259浏览 • 1回复 待解决
如何实现ArkTSC/C++数组转换
773浏览 • 1回复 待解决
c/c++层主动调用ArkTS存在问题
421浏览 • 1回复 待解决
ArkTS调用C++类中成员函数
1342浏览 • 1回复 待解决
HarmonyOS ArkTSC/C++交互
767浏览 • 1回复 待解决
ArkTSC++互相直接调用
2316浏览 • 1回复 待解决
如何实现ArkTSC/C++HashMap转换?
1151浏览 • 0回复 待解决
C++ 如何获取操作 Arkts 实例
970浏览 • 1回复 待解决
ArkTS对象绑定C++对象如何回收?
948浏览 • 1回复 待解决
如何实现ArkTSC/C++对象传递
681浏览 • 1回复 待解决
HarmonyOS C++ArkTS交互
19浏览 • 1回复 待解决
ArkTSC++之间交互
1442浏览 • 1回复 待解决
HarmonyOS ArkTSC++ 偶现方法找不到。
554浏览 • 1回复 待解决