【问题标题】:NDK set environment variables in build scriptsNDK 在构建脚本中设置环境变量
【发布时间】:2014-05-27 19:17:15
【问题描述】:

根据 NDK 文档中的 OVERVIEW.html,您设置了环境变量“NDK_LIBS_OUT”以使库转到 $PROJECT/libs 以外的其他位置。

就我而言,Gradle 似乎希望共享库转到 $PROJECT/src/main/jniLibs,因此我将 NDK_LIBS_OUT 设置为该目录。这行得通。

现在我将如何在 Android.mk 或 Application.mk 中进行设置?我不想每次都设置这个环境变量,尤其是当我将构建脚本交给其他人时。

【问题讨论】:

  • 我不相信你能做到。环境只能从父代传给子代,而不是从子代传给父代。因此,要从该文件执行此操作并使其在其他地方生效,您可能必须添加其他扫描文件的内容以提取此文件并将其设置在父级中。

标签: android android-ndk


【解决方案1】:

正如 Chris 所说,您无法从 *.mk 文件中操作此变量。

您可以通过在构建库后移动或复制库来从 Android.mk 复制此行为:

all: jniLibs/$(TARGET_ARCH_ABI) jniLibs/$(TARGET_ARCH_ABI): libs/$(TARGET_ARCH_ABI) $(call host-mkdir,$@) $(call host-cp,$<,$@)

否则,如果修改 gradle 构建脚本是一个选项,您可以在 build.gradle 中进行设置,这样 gradle 将查找位于 libs 文件夹而不是 jniLibs 的库:

android { sourceSets.main { jniLibs.srcDir 'src/main/libs' } }

【讨论】:

  • 第一个看起来不错...问题是 Android.mk 似乎没有将每个库输出指定为 Makefile 目标。涉及一些非常奇怪的语法。因此,当涉及到依赖项libs/$(TARGET_ARCH_ABI) 时,它会感到困惑,因为显然没有定义如何创建每个依赖项的规则。也许include $(CLEAR_VARS) 抹掉他们?
【解决方案2】:

如果你想自动化你的 make 文件,最好的选择是使用CMake。使用 CMake 组织源代码非常酷,因为您可以在 Windows 上快速生成 Visual Studio 解决方案文件并在 Linux 上制作文件,因此可以在不同平台上构建和测试代码,而无需维护两个单独的构建 scripts

您的 cosscompile 文件将如下所示:

include(CMakeForceCompiler)
set(toolchain_path /opt/ndk/toolchains)
# Target system
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_SYSTEM_VERSION 1)

# Compiler to build for the target
set(CMAKE_C_COMPILER /opt/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc)
set(CMAKE_FIND_ROOT_PATH /opt/ndk/toolchains)

所以,您只需创建setups 就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2013-11-15
    • 2020-04-05
    • 2012-04-20
    相关资源
    最近更新 更多