At Red Hat, we all love playing with new technologies, and sometimes we find gaps that haven't yet been filled. I want to take a few minutes to share a personal project I've been working on in my spare time. It is a native C++11 add-on that allows you to run a JVM in Node.js, giving access to the mature Java ecosystem of libraries and frameworks.

Motivation

I just wanted some mature PDF library in Node.js, like iText, PDFBox . Those libraries are very mature, for example it took PDFBox 3 years to get to version 2.0 from version 1.8, so I realized that it would be easier to look for a way to use those existing Java libraries, rather than reproduce the effort in Node.js.

How it works

Simply put, I wrote a wrapper for the JNI library, using C++11 to abstract the complexity. I call this wrapper LibJNI.

It handles multi-threading support, reflection, type safety and allocation-dealloc and local/global JVM references. This library could also come in handy for C++ developers that want to integrate native features (intensive computation, real-time graphics, etc) with Android, but I digress.

Once I had the JNI wrapper, I then wrote the actual V8 extension, called "Ella", which transforms Java classes to object literals in Javascript and allows us to access Node's asyncronous functionality.

Install

Installation is simple --- you just need to ensure you have a JAVA_HOME environment variable configured.

export JAVA_HOME="/path/of/your/jdk/"
npm install ella 

Once installed here are the basics:

var ella = require('ella');

ella.start(function(o){
  var s = o.new('java.lang.StringBuffer'); //instantiate StringBuffer. 
  s.append('hello');  // append hello
  s.append('world');  // hello world 
  s.reverse();        // dlrow ollew
  console.log('->',s); // [function body]
})

Objective

The objective is not writing Java inside Node.js for the sake of it, but expose the functionality of library you want to use and have it accessible in Node.

Overhead

Performance is an issue, and there is some overhead. I've designed this add-on to be fast as I was able to achieve. Communication between Node and Java a method call is ≈0.836 ms (milliseconds, fast!) There is probably room for improvement, but, for scale, at the time of writing this the latency to my home router is ≈3.0 ms. So, being ultra simplistic, Ella is 3 time more responsive than a local intranet network call.

 

Want to watch a demo ?

https://www.youtube.com/watch?v=obATexBVtw4

 

Look interesting?

if you want to contribute with Java API wrappers, code or installer, you can find the project here. https://github.com/cesarvr/Ella