我的Java原生音频库存在问题,但首先,这是我目前的方法:
所以现在我试图弄清楚如何防止从C ++或Java中删除流。
一种解决方案是在流中创建一个线程,以防止删除。
但我不喜欢这个解决方案......
所以我搜索了如何使这些对象保持活着并发现,所谓的“全局引用”可以用JNI制作。但我不明白它们是仅用于java对象还是两者都用。
此外,我尝试了C ++的另一种指针类型是否有帮助。
我感谢任何帮助或想法,它不一定只是JNI。 C ++标准库方法/函数/类等也很好:)!
系统信息:
使用全局流,可以访问所有JNI方法的流。
编辑:
好的,'让猫从背后出来'我正在使用RtAudio。 Realtime C++ Audio Library
示例:
//THIS IS C++ CODE
RtAudio audio(RtAudio::WASAPI);
int callback(//Buffer stuff etc.){
//do something
if(data.isEmpty())return 1;//invokes audio.closeStream() but this does NOT closes the stream!
else return 0; //Go on with the stream rather wait for the next call
}
JNIEXPORT void JNICALL openStream(jintArray data){
//This is a outputstream
audio.openStream(&outputParams,....., &callback,....);
audio.startStream();
}
JNIEXPORT void JNICALL fillData(jintArray data){
//filldata again!
stream.start(); //Starts the stream but does nothing, because the stream is deleted because of Java
}
如果我将openStream方法更改为此方法,则不会删除该流,但我会寻找更好的解决方案......
JNIEXPORT void JNICALL openStream(jintArray data){
//This is a outputstream
audio.openStream(&outputParams,....., &callback,....);
audio.startStream();
**while(true); //ADD THIS AND THE STREAM WON'T BE DELETED!**
}
另一个解决方案是在RtAudio API中添加一个“keepInstanceAliveThread”,它在stopStream()方法之后调用,并在调用startStream()或closeStream()之后删除。我宁愿选择另一种解决方案,但根本没有,但是还没有。
预结果:
感谢@marcinj:
众所周知,全球物体会造成许多问题,难以控制它们的构造/破坏。
编辑: 我在互联网上(也在stackoverflow上)发现,在返回JNI方法后调用析构函数。