我想构建一个具有不同变体/版本的共享库,我可以在 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/