JNI通过多个JNI调用使C ++中的对象保持活动状态

时间:2016-05-09 14:07:15

标签: java c++ pointers reference java-native-interface

我的Java原生音频库存在问题,但首先,这是我目前的方法:

  1. 使用本机方法我打开一个'全局'流,它通过回调函数接收数据。
  2. 回调函数一直运行,直到没有数据。
  3. 如果没有数据,则流仅停止,但不会关闭。
  4. 现在我想再次为数据流提供数据[尝试再次启动流程(允许此操作)],但该流已被删除。
  5. 所以现在我试图弄清楚如何防止从C ++或Java中删除流。

    一种解决方案是在流中创建一个线程,以防止删除。

    但我不喜欢这个解决方案......

    所以我搜索了如何使这些对象保持活着并发现,所谓的“全局引用”可以用JNI制作。但我不明白它们是仅用于java对象还是两者都用。

    此外,我尝试了C ++的另一种指针类型是否有帮助。

    我感谢任何帮助或想法,它不一定只是JNI。 C ++标准库方法/函数/类等也很好:)!

    系统信息:

    • 编译器:MinGW64 over MSYS2
    • JDK8u91
    • 当然是64位操作系统(不一定要命名为xD)

    使用全局流,可以访问所有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方法后调用析构函数。

0 个答案:

没有答案