使用 Bazel 在 Android Lib 上包含 JNI header

Include JNI header on Android Lib with Bazel

我正在尝试将 JNI 与 Bazel (0.12.0) 一起使用:

工作区文件:

android_ndk_repository(
    name = "androidndk",
)

libs/hello_lib_c/BUILD:

cc_library(
    name = "hello_lib_c",
    srcs = ["src/hello.c"],
    visibility = ["//visibility:public"],
)

libs/hello_lib_c/src/hello.c:

#include <jni.h>

JNIEXPORT jstring JNICALL
Java_eu_tamere_bazel_HelloJNI_hello(JNIEnv *env, jclass clazz) {
  return (*env)->NewStringUTF(env, "Hello from JNI ");
}

libs/hello_lib_java/BUILD:

android_library(
    name = "hello_lib_java",
    srcs = glob(["src/eu/tamere/bazel/**"]),
    deps = ["//libs/hello_lib_c"],
    visibility = ["//visibility:public"],
)

构建 Java 库时,未找到 jni.h header 文件。关于如何声明依赖关系的任何想法?

$ bazel build //libs/hello_lib_java
INFO: Analysed target //libs/hello_lib_java:hello_lib_java (22 packages loaded).
INFO: Found 1 target...
ERROR: /path/to/project/libs/hello_lib_c/BUILD:1:1: C++ compilation of rule '//libs/hello_lib_c:hello_lib_c' failed (Exit 1)
libs/hello_lib_c/src/hello.c:1:10: fatal error: jni.h: No such file or directory
 #include <jni.h>
          ^~~~~~~
compilation terminated.
Target //libs/hello_lib_java:hello_lib_java failed to build
Use --verbose_failures to see the command lines of failed build steps.

我已经尝试将 hdrs = ["@androidndk//:jni_header"], 添加到 cc_library 定义中,但它现在也可以了。我还尝试在 WORKSPACE 中为 Android NDK 显式设置 path,但它没有改变。

android example on the official repo 没有指定在哪里可以找到 jni 库。

目前看来,如果不使用一些技巧,在 android_library(即 .aar)中使用 JNI 是不可能的。只有 android_binary(即 .apk)会 link jni 库。

来自 https://github.com/bazelbuild/bazel/issues/348 :

android_library .aar output does not currently support bundling native libraries. This is a known deficiency that I believe @dkelmer has plans to work on.

aj-michael 有一个带有解决方法的 repo:

https://github.com/aj-michael/aar_with_jni