我正在尝试将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的位置。
答案 0 :(得分:1)
似乎在没有一些技巧的情况下,目前无法在android_library
内使用JNI(即.aar
)。只有android_binary
(即.apk
)才能链接jni lib。
来自https://github.com/bazelbuild/bazel/issues/348:
android_library .aar输出目前不支持捆绑本机库。这是一个已知的缺陷,我相信@dkelmer计划继续努力。
aj-michael有一个带有解决方法的回购: