在Android上用Java或C/C++解码Airplay数据包

Mat*_*ley 8 c++ java android android-ndk airplay

我正在为一个Android应用程序的子部分工作AirPlay接收器.我使用以下框架:

https://github.com/pentateu/DroidAirPlay

虽然这在一些中档设备(如miPad)上运行良好,但我们需要在低规格的自定义设备上运行.自定义设备正在以比miPad慢10倍到20倍的速度解码airplay数据包.结果,音频数据包失去时间同步,并且由于解码数据包所花费的时间,音频永远不会重新同步.

我正在寻找Play商店中的其他一些airplay接收器应用程序,从我可以看到它们倾向于基于Shairport(https://github.com/abrasive/shairport)用于播放接收器方面.

**注意:**基于Shairport的框架似乎没有在低端设备上遇到同步问题.

我使用的框架很大程度上基于Shairport框架,除了它是用Java编写的.

对于解码数据,C/C++是否远优于Java?

如果是这样,使用NDK通过C或C++实现指导DroidAirPlay框架的解码部分会给我带来很大的性能提升吗?

提前致谢

马特

Xun*_*nie 0

虽然 Java 确实编译为在虚拟机中运行的字节码,但它不一定比本机编译的可执行文件慢(或快),无论是否是 C/C++。这一切都取决于程序!

在这种情况下,Java 可能会变慢的原因有很多:

  • 解码实现可能只是编码/优化不佳?(这并不是Java的错)
  • Java 编译器可能会为 JVM 生成次优代码。
  • Java 的某些语言结构对于速度/资源需求来说太慢了。
  • JVM 只是另一个抽象层,也是罪魁祸首
  • 垃圾收集已经开始了?!

(这里我必须指出,我不是 Java 专家!)

然而,我仍然不会认为 Java本质上比 C 或 C++ 慢。我确信您可以在互联网上找到许多将一种语言与另一种语言进行比较的基准和测试,并且有些在一定程度上做出了声明(出于骄傲和自负?)。但这些测试只是特定情况,通常测试较大语言的特定方面(例如哈希映射查找性能!)。

LLVM 有一篇关于 C 的三部分博客文章,解释了为什么未定义的行为允许编译器生成仍然正确但更有效的代码,但代价是推断运行时安全检查或决定 i+1总是在 i 之后,完全忽略了存在整数溢出。如果程序员不小心,这可能会带来灾难性的后果。

用 Bjarne 本人在Abstraction and the C++ machine model中的话来说:

C++ 被设计为一种系统编程语言,从最早开始就用于嵌入式系统编程和其他资源受限类型的编程。

因此,我相信 C 和 C++ 可以比 Java 发展得更远,因为这种未定义的行为和对其施加的限制更少。(还有内联汇编位,但这不是严格的 C!)