代码之家  ›  专栏  ›  技术社区  ›  Greg

要为Android(NDK)构建(部分)WebRTC,我需要做什么?它找不到C++头

  •  2
  • Greg  · 技术社区  · 8 年前

    我正在尝试将WebRTC的一些功能构建到一个项目中。我们之前已经有了一些只运行C语言的代码,我正在尝试添加更多的文件。新文件是C++,当我运行 ndk-build 我发现与C++相关的错误包括:

    [armeabi] Compile++ thumb: zello.webrtc <= audio_frame.cc
    In file included from libwebrtc/jni/libwebrtc/api/audio/audio_frame.cc:15:
    libwebrtc/jni/libwebrtc/rtc_base/checks.h:36:10: fatal error: 
      'sstream' file not found
    #include <sstream>
             ^~~~~~~~~
    1 error generated.
    

    我的 Application.mk 文件包括

    APP_ABI := armeabi armeabi-v7a arm64-v8a x86 x86_64
    APP_OPTIM := release
    APP_PLATFORM := android-15
    APP_STL := c++_shared
    APP_CPPFLAGS := -fexceptions
    NDK_TOOLCHAIN_VERSION := clang
    

    还有我的 Android.mk 文件包括

    LOCAL_CPPFLAGS := -std=c++11
    LOCAL_CPP_EXTENSION := .cpp .cc
    LOCAL_SRC_FILES := \
        webrtc-jni.cpp \
        libwebrtc/api/audio/audio_frame.cc \
        ...
    

    我试着明确地添加

    LOCAL_C_INCLUDES += $(NDK_ROOT)/sources/cxx-stl/llvm-libc++/include
    

    但这只会导致更多关于未定义函数的错误,而且似乎一开始就没有必要这样做。我还尝试指定了的所有其他值 APP_STL 没有效果。

    我正在使用NDK 16b进行构建,因为我们仍然需要支持 armeabi 设备。

    提前感谢您的建议。

    编辑:当我跑步的时候 ndk-build V=1 我明白了 ndk构建 可能使用了错误的STL头目录:

    ... -I${NDK_ROOT}/sources/cxx-stl/system/include ...
    

    但我已经定义了 应用程序 c++_shared ,我 认为 应该在另一个目录中查找。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Greg    8 年前

    解决办法是把 APP_STL 顶层定义 Application.mk 文件我们的应用程序结构如下

    top/Application.mk
    top/Android.mk
    top/...
    top/submodule1/jni/Application.mk
    top/submodule1/jni/Android.mk
    top/submodule1/jni/...
    top/submodule2/jni/Application.mk
    top/submodule2/jni/Android.mk
    top/submodule2/jni/...
    ...
    

    我已经定义了 应用程序 在其中一个子模块中 应用mk 那些可能被完全忽略的文件?将定义移动到顶层文件可以使构建正常工作。

    推荐文章