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

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

阅读 517
1 个回答

尝试下如下方案

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 方法中,根据传入的索引调用对应的方法

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
HarmonyOS
子站问答
访问
宣传栏