我已经设法构建了我的JNI库(jar,jni共享cc_library,包装的cc_library),但是我看不到如何构建使用它的Java应用程序。我的BUILD很简单:Bazel:具有JNI依赖性的Java应用程序
java_binary(
name = "OCFTestServer",
srcs = glob(["src/main/java/**/*.java"]),
deps = ["//:OpenOCF-JNI"])
这里OpenOCF-JNI
看起来是这样的:
java_library(
name = "OpenOCF-JNI",
srcs = glob(["src/main/**/*.java"]),
deps = ["libopenocf"],
visibility = ["//visibility:public"])
而且libopenocf
是:
cc_library(
name = "libopenocf",
srcs = glob(["src/c/*.c"]) + glob(["src/c/*.h"])
+ ["@local_jdk//:jni_header",
"@local_jdk//:jni_md_header-darwin"],
... etc ...
这些都成功打造。但是,构建不会导致依赖性被建立,这正是我所期望的(即构建OCFTestServer应该会导致OpenOCF-JNI被构建,这应该会导致构建libopenocf-jni)。这不应该发生?
如果我使用单独的步骤构建它们,然后尝试运行应用程序(使用bazel-bin中的OCFTestServer包装器),则获得UnsatisfiedLinkError: no libopenocf-jni in java.library.path
。但是通过阅读文档,我得到的印象是应该全部自动设置(即所需的jni库应该放在java.library.path中)。
我在做什么错?有没有人有一个构建和使用JNI库的例子?
我认为你的cc_library应该将srcs从它的hdrs中分离出来。不确定这是否相关。 – kd8azz
@ kd8azz:afaik'hdrs'用于公共(即api)标题。否则所有标题都被视为源文件。 – mobileink
我认为这是在这里回答:https://stackoverflow.com/questions/46160790/bazel-for-jni-jni-h-file-not-found – mhlopko