Tensorflow JNI development

From ElphelWiki
Revision as of 17:26, 4 March 2020 by Oleg (talk | contribs) (About)
Jump to: navigation, search


Based on Build TensorFlow 2.0 for Java on Windows article. Also this one - tensorflow/java/README.md.

These instructions are for Linux and old TensorFlow 1.15.0.

How to:

  • Build TF JNI - libtensorflow.jar, libtensorflow_jni.so
  • Add libtensorflow.jar to local Maven repository which will override the Central Maven Repository
  • Modify TF JNI functions
  • Create a Maven project and use modified TF JNI

There's JavaCPP Presets project. But they fail to clearly explain what it does.


  • In Kubuntu
  • Get TF 1.15.0 - git or archive
  • Install bazel 0.25.2 - see *.deb in releases


cd ~/git/tensorflow-1.15.0
./configure # do not forget CUDA
bazel build -c opt //tensorflow/java:tensorflow //tensorflow/java:libtensorflow_jni //tensorflow/java:pom

With tensorflow bazel (when restarted?) tends to rebuild everything from scratch which takes a ton of time. Bazel starts its server which, to prevent it, add to ~/.bazelrc:

startup --max_idle_secs=0

Artifacts of interest in bazel-bin/tensorflow/java/:

  • xml and jar are taken care of.
  • so will have to be in the library path - set LD_LIBRARY_PATH or PATH or go "java -Djava.library.path"

Install TF to local maven repo

mvn install:install-file -Dfile=bazel-bin/tensorflow/java/libtensorflow.jar -DpomFile=bazel-bin/tensorflow/java/pom.xml

How to uninstall maven local repo - and switch back to official versions form Central:


Modify TF JNI

For example, one wants to create a new function in org.tensorflow.TensorFlow package. Then, see:

  • add native method to tensorflow/java/src/main/java/org/tensorflow/TensorFlow.java
  • add to header file tensorflow/java/src/main/native/tensorflow_jni.h
  • add to c file tensorflow/java/src/main/native/tensorflow_jni.cc
  • rebuild and reinstall to mvn

Java maven project in Eclipse

  • Create a new maven project
  • Edit pom.xml:

Basic example code


import org.tensorflow.TensorFlow;

public class tfhello{
	public static void main(String[] args){