J'ai réussi à construire ma bibliothèque JNI (le jar, la bibliothèque partagée jni, la cc_library) mais je ne vois pas comment créer une application Java qui l'utilise. Mon BUILD est simple:Bazel: application Java avec dépendance JNI
java_binary(
name = "OCFTestServer",
srcs = glob(["src/main/java/**/*.java"]),
deps = ["//:OpenOCF-JNI"])
Ici OpenOCF-JNI
ressemble à ceci:
java_library(
name = "OpenOCF-JNI",
srcs = glob(["src/main/**/*.java"]),
deps = ["libopenocf"],
visibility = ["//visibility:public"])
Et libopenocf
est:
cc_library(
name = "libopenocf",
srcs = glob(["src/c/*.c"]) + glob(["src/c/*.h"])
+ ["@local_jdk//:jni_header",
"@local_jdk//:jni_md_header-darwin"],
... etc ...
Tous ces construire avec succès. Cependant, la construction ne provoque pas la construction de dépendances, ce à quoi je m'attendrais (autrement dit, la construction d'OCFTestServer devrait entraîner la construction d'OpenOCF-JNI, ce qui devrait entraîner la construction de libopenocf-jni). Cela ne devrait-il pas arriver? Si je les compile tous en utilisant des étapes séparées, puis que j'essaie d'exécuter l'application (en utilisant l'encapsuleur OCFTestServer dans bazel-bin), j'obtiens UnsatisfiedLinkError: no libopenocf-jni in java.library.path
. Mais à la lecture des documents, j'ai l'impression que tout devrait être mis en place automatiquement (c'est-à-dire que la librairie jni nécessaire doit être placée dans le fichier java.library.path).
Qu'est-ce que je fais mal? Quelqu'un at-il un exemple de construction et d'utilisation d'une librairie JNI?
Je pense que votre bibliothèque cc_ est censée séparer ses srcs de ses hdrs. Je ne sais pas si c'est lié. – kd8azz
@ kd8azz: afaik 'hdrs' est pour les en-têtes publics (c'est-à-dire api). sinon, tous les en-têtes sont considérés comme des fichiers sources. – mobileink
Je pense que ceci est répondu ici: https://stackoverflow.com/questions/46160790/bazel-for-jni-jni-h-file-not-found – mhlopko