android - ndk-build NDK_TOOLCHAIN_VERSION 4.8 与 clang

标签 android android-ndk java-native-interface toolchain

不久前,我为 C libspeex 音频编解码器开发了一个 jni 包装器。 最近,我在使用 ndk r10e 编译和运行它时遇到了一些问题,因为音频编码功能在运行时崩溃了。

最后我发现当我用

编译时
NDK_TOOLCHAIN_VERSION:=4.8

native 代码在使用时运行

NDK_TOOLCHAIN_VERSION:=clang

它崩溃了。我想知道这两个工具链之间的区别。

崩溃的 logcat:

11-02 14:26:33.642 1908-1908/com.ermes.intau D/dalvikvm: GC_FOR_ALLOC freed 1248K, 20% free 34140K/42456K, paused 102ms, total 102ms
11-02 14:26:33.642 1908-2514/com.ermes.intau A/libc: Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 2514 (Thread-103909)
11-02 14:26:33.742 1908-1908/com.ermes.intau D/dalvikvm: GC_FOR_ALLOC freed 6K, 18% free 34883K/42456K, paused 89ms, total 89ms

最佳答案

gcc 和 clang 是完全不同的 C 编译器。他们没有共同的代码。

当然,它们不是凭空开发的。两个编译器的开发人员确实相互竞争以生成最好/最快的机器代码。虽然它们执行的优化可能基于相同的想法,但它们都有不同的边缘情况,这些情况将以不同的方式进行编译。

由于 clang 是最新开发的编译器,他们确实尝试编译其他有 gcc 编译历史的开源项目。每当发现错误时,都会更改 clang 或开源项目。

C 语言标准还留下了许多未定义的行为。像除以零、取消引用 NULL 指针、有符号整数溢出、堆栈分配对齐之类的事情......两个编译器都将利用这些边缘情况来生成更快的代码。如果一段代码“可能”做了一些奇怪的事情,编译器可以假设开发人员知道他们在做什么,并且已经在其他地方处理了这些情况。 http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html

关于android - ndk-build NDK_TOOLCHAIN_VERSION 4.8 与 clang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33416410/

相关文章:

android - 获取 MediaCodec 解码器以 RGBA 格式提供视频帧

Java多线程: Implementing of important methods in Thread class in Native Libraries?

android - 将 Flutter with Fabric 分发给 Beta 测试人员

Android 流到 rstp 服务器并使用 nginx 转换为 rtmp

android - OpenCv 和 Android studio 1.3+ 使用新的 gradle - undefined reference

java - JNI 缓存的 jclass 全局引用变量被垃圾收集?

c++ - JNI_CreateJavaVM : Buffer overrun if I throw an exception in case of failure

Android TableLayout vs GridView vs 其他?

android - 两部安卓手机之间的距离

android - 在没有 gradle、ant 或 cmake 的情况下仅创建 JNI/NDK apk 命令行