android - 我需要做什么才能为 Android (NDK) 构建(部分)WebRTC?它找不到 C++ header

标签 android c++ android-ndk webrtc ndk-build

我正在尝试将 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-build 可能使用了错误的 STL 头目录:

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

但我已将 APP_STL 定义为 c++_shared,我认为应该在不同的目录中查找。

最佳答案

解决方案是将 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/...
...

我在其中一个子模块 Application.mk 文件中定义了 APP_STL,这可能已被完全忽略?将定义移至顶层文件使构建工作正常。

关于android - 我需要做什么才能为 Android (NDK) 构建(部分)WebRTC?它找不到 C++ header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50470580/

相关文章:

android - 在 kotlin 中,如何在目标需要 List 的地方传回 MutableList

c++ - 为 const 引用和右值引用编写重载

Android NDK - OpenGL ES 教程/库

android - 无法为类型com.android.build.gradle.internal.dsl.NdkOptions的对象获取未知属性 'arm64-v8a'

android - Android-JNI 检测到应用程序错误中 AndEngine GLES2 的 Proguard 问题

java - TabLayout 不会填充

Android 将特定 API 调用限制为 3 秒内一次

android - 数据库创建语句没有创建第二个表?

C++ STL 迭代器接口(interface)

c++ - 为处理器执行除法和取模的最佳方法是什么?