我感兴趣的是将一些C++库包装为react本机模块,但我遇到了一些概念上的障碍。对这些东西很陌生,所以请容忍我!
我想包装一些类似于Juce 1AudioGraphIOProcessor的AudioProcessorGraph功能
然而,api的一个重要组件是将音频节点对象彼此连接起来,形成音频处理图。您可以想象一些非常类似于web音频api的东西:
const audioCtx = new AudioContext();
const oscillator = new OscillatorNode(audioCtx);
const gainNode = new GainNode(audioCtx);
oscillator.connect(gainNode).connect(audioCtx.destination);在编写一行代码之前,我看到的问题是,我看不到用RCT_EXPORT_METHOD宏将本机对象的实例作为参数传递给另一个本机对象的方法调用的方法。objects --我使用ObjectWrap功能对本机节点加载项做了类似的事情。是否有类似的反应本土化的成就?
发布于 2017-12-31 16:26:59
RCT_EXPORT_METHOD用于将函数导出到IOS中的JS端。这里的警告是,您通过JS传递给本机或从本机传递到JS的参数应该是可序列化的。这是因为通信以异步方式通过RN进行。
在你的情况下我会这么做。让我们举个例子:
假设您在本机模块中有一个函数。
//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端,您也可以完成所需的功能。
https://stackoverflow.com/questions/48039576
复制相似问题