Bazel:如何构建一个使用 JNI 的C++应用程序



在这个答案中,@hlopko展示了如何构建一个调用本机代码的Java应用程序。但是,如何构建调用 Java 代码的本机应用程序呢?

我的尝试(详见下文(失败,并显示:

Error occurred during initialization of VM
Unable to load native library: 

他就是代码。 BUILD.bazel

cc_binary(
    name = "main",
    srcs = [
        "main.cc",
        "@local_jdk//:jni_header",
        "@local_jdk//:jni_md_header-linux",
        "@bazel_tools//tools/jdk:current_java_runtime",
    ],
    includes = [ "external/local_jdk/include", 
    "external/local_jdk/include/linux"],
)

main.cc

#include <jni.h>
int main() {
  JNIEnv *env;
  JavaVM *jvm;
  JavaVMInitArgs vm_args;
  JavaVMOption options[0];
  jint res;
  vm_args.version = JNI_VERSION_1_4;
  vm_args.options = options;
  vm_args.nOptions = 0;
  vm_args.ignoreUnrecognized = JNI_FALSE;
  /* Create the Java VM */
  res = JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args);
}
rules_jvm(

我是作者(提供了一个目标 at @fmeum_rules_jni//jni:libjvm,您可以链接到该目标,其行为与libjvm.so 一样,但在执行时会自动找到库。如果另外调用 rules_jni_init ,它将找到 Bazel 使用的当前 Java 运行时。

相关内容

最新更新