在这个答案中,@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 运行时。