0

我有兴趣将一些 C++ 库包装为 react-native 模块,但我遇到了一些概念墙。对这些东西很陌生,所以请多多包涵!

我想包装类似 Juce 的 AudioProcessorGraph 功能https://juce.com/doc/classAudioProcessorGraph_1_1AudioGraphIOProcessor

然而,api 的一个重要组成部分是将音频节点对象相互连接以形成音频处理图。你可以想象一些与网络音频 api 非常相似的东西:

const audioCtx = new AudioContext();
const oscillator = new OscillatorNode(audioCtx);
const gainNode = new GainNode(audioCtx);

oscillator.connect(gainNode).connect(audioCtx.destination);

在我写一行代码之前,我看到的问题是,我没有看到使用 RCT_EXPORT_METHOD 宏将本机对象的实例作为参数传递给另一个本机对象的方法调用的方法。https://nodejs.org/api/addons.html#addons_wrapping_c_objects我使用 ObjectWrap 功能对本机节点插件做了类似的事情。反正有没有用 react-native 完成类似的事情?

4

1 回答 1

1

RCT_EXPORT_METHOD 用于将函数导出到IOS中的JS端。这里需要注意的是,您通过 JS 传递给 Native 或从 Native 传递给 JS 的参数应该是可序列化的。这是因为通信是通过 RN Bridge 以异步方式发生的。

这就是我在你的情况下会做的。让我们举个例子:

假设您在本机模块中有一个功能

//Initialise a list to store audioContexts
ArrayList<AudioContext> audioCtxList = new ArrayList<AudioContext>();

@ReactMethod
public void createAudioContext(Callback cb){
AudioContext audioCtx = new AudioContext();
audioCtxList.add(audioCtx);
cb.invoke(//...index of the newly created audioCtx)
}

现在在 JS 方面,您有一个参考,您可以使用它来与本机模块对话

所以下一个函数看起来像

@ReactMethod
public void createOscillator(int audioCtxId){
 AudioCtx actx = // Get the audioContext from the list using the audioCtxId
 const oscillator = new OscillatorNode(audioCtx);
 const gainNode = new GainNode(audioCtx);
 oscillator.connect(gainNode).connect(audioCtx.destination);
}

因此,您不需要将任何本机对象导出到 JS 端,您也可以完成您需要的功能。

于 2017-12-31T16:26:59.017 回答