我创建了一个简单的存储库:https://github.com/mhlopko/bazel-jni-example帮助您入门。
BUILD
:
cc_library(
name = "main-jni-lib",
srcs = [
"@local_jdk//:jni_header",
"@local_jdk//:jni_md_header-linux",
"Main.cc"
],
hdrs = [ "Main.h" ],
includes = [ "external/local_jdk/include", "external/local_jdk/include/linux" ],
)
cc_binary(
name = "libmain-jni.so",
deps = [ ":main-jni-lib" ],
linkshared = 1,
)
java_binary(
name = "Main",
srcs = [ "Main.java" ],
main_class = "Main",
data = [ ":libmain-jni.so" ],
jvm_flags = [ "-Djava.library.path=." ],
)
Main.java
:
public class Main {
static {
System.loadLibrary("main-jni");
}
private native int foo();
public static void main(String[] args) {
System.out.println(new Main().foo());
}
}
Main.h
:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Main */
#ifndef _Included_Main
#define _Included_Main
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Main
* Method: foo
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_Main_foo(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
Main.cc
:
#include <jni.h>
#include <stdio.h>
#include "Main.h"
JNIEXPORT jint JNICALL Java_Main_foo(JNIEnv *, jobject) {
return 42;
}
现在通过运行bazel run :Main
你应该看到42
打印出来,来自Main.cc
。该示例显然需要更多改进,以便它可以在 Linux 以外的平台上运行,并且可以与启动器脚本一起运行。您最终可能需要多个System.loadLibrary
调用,就像 bazel 中所做的那样它的窗口加载程序.