android - 使用 AndroidStudio + gradle + NDK 为 Android 和 Linux 构建库

标签 android linux android-ndk android-gradle-plugin portability

我想构建一个具有不同变体/版本的共享库,我可以在 Android 和 Linux 应用程序中使用。

因此,我设置了一个由应用程序模块和( native C/C++)库模块组成的 Android 项目,如官方 Android Studio documentation 中所述。 *,因此我完整的库构建工具链包括**:

  • 安卓工作室
  • gradle/build.gradle
  • cmake/CMakeLists.txt
  • 忍者
  • clang

我的代码实际上是可移植的,例如我在 Android 特定代码路径周围使用了 #ifdef __ANDROID__,并且我可以手动编译一个工作的 Linux 共享对象,也就是说,通过从命令行调用编译器。

有没有一种很好的方法可以使用上述工具链为 Android 和 Linux 创建 .so 文件,而无需维护两组冗余的构建配置文件?

* 我遵循了 2017 年 5 月的文档,它与这个几乎相同 archive.org snapshot从 2017 年 2 月开始。

** 我不使用 Android.mk 和 ndk-build,所以 this related question不适用于我,即使目的相同。

最佳答案

事实证明,这比我想象的要容易。在这种情况下,Linux 版本不需要 Gradle,并且 Cmake 配置主要可跨 Android 和 Linux 移植。所以理论上,您可以:

cd $AndroidProject/librarymodule/build
cmake -G "Unix Makefiles" .. && make

如前所述,这绕过了 gradle,意味着 build.gradle 中的配置是神经应用的。

最简单的修复方法是将这些设置添加到 CMakeLists.txt 中,如下所示:

# (...) Common defintions for both platforms here (...)

if (ANDROID)
    find_library( log-lib log )
    target_link_libraries( librarymodule ${log-lib} )
else ( )
    find_package( OpenCV REQUIRED )
    target_compile_definitions ( librarymodule PUBLIC ENABLE_DEBUG_LOGGING linux HAVE_LIBUDEV)
    target_include_directories ( librarymodule PRIVATE  src/main/cpp ../otherlib/src/main/cpp )
    target_compile_options ( librarymodule PRIVATE -Wall -Wno-unknown-pragmas -O0 -g -std=c++11 -fexceptions )
    target_link_libraries( librarymodule pthread ${OpenCV_LIBS} )
)

将相同/相似的设置分散在 Android 的 build.grade 和 Linux 的 CMakeLists.txt 中是有缺点的。可能的解决方案:

  • 将所有这些设置移到 CMakeLists.txt 中。应该是微不足道的。
  • 尝试将 Gradle 用作 Android 和 Linux 的包装器,并将所有设置移至 build.gradle。可能很复杂。

关于android - 使用 AndroidStudio + gradle + NDK 为 Android 和 Linux 构建库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44391823/

相关文章:

android - 如何在 android 中重置/更新 DHCP?

android - java.lang.ClassCastException : android. app.ContextImpl 无法在 ImageButton Android 上转换为 "Activity"

android - 为什么 Android TV 应用程序的 Web View 分辨率较低

c - 为什么 linkat 需要路径名而不是文件描述符?

linux - 将 Find 命令的输出附加到 Bash 脚本中的变量

android - ld 返回 1 退出状态 - c

android - 在设备上安装 apk 时出现“权限被拒绝”错误

android - "Your Android SDK is missing, out of date, or corrupted"怎么解决?

python - 在 Linux 中安装 Pillow(Python 模块)时失败

c++ - 构建 dschaefer/android-box2d 时出现问题