Android ndk 构建C++;使用bazel使用android ndk工具链瞄准目标

Android ndk 构建C++;使用bazel使用android ndk工具链瞄准目标,android-ndk,bazel,Android Ndk,Bazel,我有一个带有tflite模型推断的.cpp代码。此源代码文件是bazel工作区的一部分。我想用默认桌面编译器和ndk的arm64自定义工具链构建它,然后在PC和手机上运行它,并比较结果。如何从ndk工具链(someandroidndkpath/toolschains/arm64/bin/clang)中指定自定义编译器 我的构建文件中有一个简单的目标: cc_binary( name = "Evaluation", srcs = ["evaluation.cpp"], vi

我有一个带有tflite模型推断的.cpp代码。此源代码文件是bazel工作区的一部分。我想用默认桌面编译器和ndk的arm64自定义工具链构建它,然后在PC和手机上运行它,并比较结果。如何从ndk工具链(someandroidndkpath/toolschains/arm64/bin/clang)中指定自定义编译器

我的构建文件中有一个简单的目标:

cc_binary(
    name = "Evaluation",
    srcs = ["evaluation.cpp"],
    visibility = ["//visibility:public"],
    deps = [
        "@org_tensorflow//tensorflow/lite:framework",
        "@org_tensorflow//tensorflow/lite/kernels:builtin_ops",
    ],
)
编辑: 多亏了@ahumesky,它才起作用。我想澄清一下如何配置android\u ndk\u存储库规则

  • 转到tf repo并将这些文件放到您的项目中

  • 将android sdk的路径和版本设置到android_configure.bzl中。(这是最简单的方法,但您可以使用.bazelrc变量进行此操作)

  • 例如:

    _ANDROID_NDK_HOME = "~/Android/Sdk/ndk/20.1.5948944/"
    _ANDROID_SDK_HOME = "~/Android/Sdk/"
    _ANDROID_NDK_API_VERSION = "29"
    _ANDROID_SDK_API_VERSION = "29"
    _ANDROID_BUILD_TOOLS_VERSION = "29.0.2"
    
    load("//third_party/android:android_configure.bzl", "android_configure")
    android_configure(name = "local_config_android")
    load("@local_config_android//:android.bzl", "android_workspace")
    android_workspace()
    
  • 添加到工作区
  • 例如:

    _ANDROID_NDK_HOME = "~/Android/Sdk/ndk/20.1.5948944/"
    _ANDROID_SDK_HOME = "~/Android/Sdk/"
    _ANDROID_NDK_API_VERSION = "29"
    _ANDROID_SDK_API_VERSION = "29"
    _ANDROID_BUILD_TOOLS_VERSION = "29.0.2"
    
    load("//third_party/android:android_configure.bzl", "android_configure")
    android_configure(name = "local_config_android")
    load("@local_config_android//:android.bzl", "android_workspace")
    android_workspace()
    
  • 使用以下标志构建目标,将其推送到android设备并运行

  • 首先确保在
    工作区
    文件中设置了
    android ndk_存储库
    规则(手动设置或通过TensorFlow的
    配置
    脚本设置),然后尝试以下bazel标志:

    --crosstool_top=//external:android/crosstool
    --host_crosstool_top=@bazel_tools//tools/cpp:toolchain
    --cpu=arm64-v8a
    
    使用Android crosstool,
    --cpu
    可以是
    arm64-v8a
    armeabi-v7a
    x86
    x86\u 64

    请注意,只有在构建
    cc\u二进制文件时才需要这些标志。如果您正在构建一个
    android\u二进制文件
    ,该
    android\u二进制文件
    依赖项中的
    cc\u库
    规则将自动使用android交叉工具