/java-jna-example

This chapter will show you how to use JAVA JNA.

Primary LanguageJavaApache License 2.0Apache-2.0

Example Java JNA

This chapter will show you how to use JAVA JNA.

See a brief summary here: https://en.wikipedia.org/wiki/Java_Native_Access

Own Library

Header

#include <stdio.h>
#include <stdlib.h>

int sum(int n1, int n2);

Implementation V1

#include <stdio.h>
#include <stdlib.h>
#include "functions.h"

int sum(int n1, int n2) {
  return n1+n2;
}

Implementation V2

#include <stdio.h>
#include <stdlib.h>
#include "functions.h"

int sum(int n1, int n2) {
  return (n1+n2) * 20;
}

Compile shared library

gcc -c -fPIC functions-v1.c -o lib/v1/functions.o
gcc -c -fPIC functions-v2.c -o lib/v2/functions.o

gcc -shared -o lib/v1/libfunctions.so lib/v1/functions.o
gcc -shared -o lib/v2/libfunctions.so lib/v2/functions.o

Function Mapping

public interface FunctionsLibrary extends Library {

  public int sum(int n1, int n2);

}

Load library

public class FunctionsNative implements FunctionsLibrary {

  private final FunctionsLibrary functionsNative;

  public FunctionsNative(final String fileName) throws IOException {
    functionsNative = Native.loadLibrary(extratcFile(fileName), FunctionsLibrary.class);
  }

  @Override
  public int sum(final int n1, final int n2) {
    return functionsNative.sum(n1, n2);
  }

  private String extratcFile(final String fileName) throws IOException {
    final InputStream source = FunctionsNative.class.getClassLoader().getResourceAsStream(fileName);
    final File file = File.createTempFile("lib", null);
    FileUtils.copyInputStreamToFile(source, file);
    return file.getAbsolutePath();
  }

}

Assert test

public class FunctionsNativeTest {

  @Test
  public void testSum() throws IOException {
    final FunctionsNative functionsV1 = new FunctionsNative("lib/v1/libfunctions.so");
    final FunctionsNative functionsV2 = new FunctionsNative("lib/v2/libfunctions.so");

    assertThat(functionsV1.sum(10, 10), equalTo(20));
    assertThat(functionsV2.sum(10, 10), equalTo(400));
  }

}

Example Application

public class Application {

  private static final Logger LOGGER = Logger.getLogger(Application.class.getName());

  public static void main(final String[] args) throws IOException {

    final FunctionsNative functionsV1 = new FunctionsNative("lib/v1/libfunctions.so");
    final FunctionsNative functionsV2 = new FunctionsNative("lib/v2/libfunctions.so");

    LOGGER.info(() -> "Function SUM v1 : " + functionsV1.sum(10, 10));
    LOGGER.info(() -> "Function SUM v2 : " + functionsV2.sum(10, 10));
  }

}

Expected output:

Sep 20, 2020 4:26:26 PM br.com.jna.Application main
INFO: Function SUM v1 : 20
Sep 20, 2020 4:26:26 PM br.com.jna.Application main
INFO: Function SUM v2 : 400

Contributing

Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests to us.

Versioning

We use GitHub for versioning. For the versions available, see the tags on this repository.

Authors

  • Marcos Vallim - Initial work, Development, Test, Documentation - mvallim

See also the list of contributors who participated in this project.

License

This project is licensed under the Apache License - see the LICENSE file for details