【发布时间】:2017-09-16 16:37:15
【问题描述】:
我已经设法构建了我的 JNI 库(jar、jni 共享的 cc_library、包装的 cc_library),但我不知道如何构建使用它的 Java 应用程序。我的 BUILD 很简单:
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 应该将其 src 与 hdrs 分开。不确定这是否相关。
-
@kd8azz: afaik
hdrs用于公共(即 api)标头。否则所有头文件都被视为源文件。 -
@mhlopko:该项目涉及构建库,而不是如何在应用程序中使用它们。
-
啊抱歉,我没注意到是你:)
标签: java java-native-interface bazel