使用Bazel在Android Lib上包含JNI标头

时间:2018-04-13 10:18:54

标签: android java-native-interface bazel

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

WORKSPACE文件:

android_ndk_repository(
    name = "androidndk",
)

库/ hello_lib_c / BUILD:

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

库/ 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 ");
}

库/ 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 lib时,找不到jni.h头文件。关于如何声明依赖关系的任何想法?

$ 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定义中,但它现在可以正常工作。我还试图在path中明确设置Android NDK的WORKSPACE,但它不会改变。

android example on the official repo未指定查找jni lib的位置。

1 个答案:

答案 0 :(得分:1)

似乎在没有一些技巧的情况下,目前无法在android_library内使用JNI(即.aar)。只有android_binary(即.apk)才能链接jni lib。

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

  

android_library .aar输出目前不支持捆绑本机库。这是一个已知的缺陷,我相信@dkelmer计划继续努力。

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

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