使用 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:
我正在尝试将 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: