# Exercise repository for Java Native Interface (JNI)
At times, it is necessary to use native codes (C/C++) to overcome the memory management and performance constraints in Java. Java supports native codes via the Java Native Interface (JNI). This repository contains a "Hello World" example for using the JNI which is based on this [tutorial](https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html).
# Repository for Raspberry Pi + PiFace Control & Display
# Prerequisites
1.**Java Development Kit 8**
2.**C/C++ Compiler**
* GCC compiler and Makefile ([Read "GCC and Make"](https://www3.ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html)) **or**
* Cygwin or MinGW on Windows ([Read "How to Setup Cygwin and MinGW](https://www3.ntu.edu.sg/home/ehchua/programming/howto/Cygwin_HowTo.html)
3.**Eclipse for Java Developers** with **C/C++ Development Tool (CDT) extension** installed ([Read "Eclipse CDT"](https://www3.ntu.edu.sg/home/ehchua/programming/howto/EclipseCpp_HowTo.html)).
3. Unselect *Use default location* and browse to cloned diretory, click *OK*
4. Enter *Project name* and click *Finish*
See [Remote Development Setup](RemoteDev-Setup.md) tutorial.
# Build project
Building the project involves two steps
1. Building Java code
* Click on *Project/Build All*. This is not necessary if *Build Automatically* is selected.
2. Building native code either on command line or using the configured Eclipse build targets
* Command line:```cd jni && make``` or
* Double click on *jni/Build Targets/all*
1. Connect to the remote device
2. Build native code on command line
* Command line:```cd jni && make```
# Run project
Before the application can be run, you must build the native code and provide the library path to the "hello.dll" file, if it is not located in the *current working directory*.
This can be done via the VM argument ```-Djava.library.path```. Right-click on the project and select *Run As/Run Configurations*, then select *Java Application*. In the *Main tab*, enter the main class "HelloJNI" and in *Arguments/VM Arguments*, enter ```-Djava.library.path=jni```. Finally click on *Run*.
You should see the output "Hello World!" displayed on the console.
This can be done via the VM argument ```-Djava.library.path```.
## Command line
```java -Djava.library.path=jni -cp bin java_exercises7_1_1.HelloJNI```
```java -Djava.library.path=jni -cp bin java_exercises8_1_1.HelloJNI```
The objective of the tutorial is to install and setup the Raspberry Pi as an Embedded Development Platform for the Java Standard Edition 8 or Java Standard Edition 8 Embedded.

## HW-Requirements
There are two different sets of hardware.
### Set One
*[Raspberry Pi (Model B+, or 2)](http://www.raspberrypi.org/)(2xUSB, HDMI (Video and Audio), SD-Card, LAN, Analogue Video,
Analogue Audio)
* Wifi-Dongle
*[PiFace Digital I/O](http://www.piface.org.uk/products/piface_digital/)(2 Changeover Relays, 4 Tactile Switches, 8 Digital Inputs, 8 Open-Collector Outputs, 8 LED Indicators)
* Cables: HDMI, USB -> USB Micro
### Set Two
*[Raspberry Pi (Model B+, or 2)](http://www.raspberrypi.org/)(4xUSB, HDMI (Video and Audio), Micro-SD-Card, LAN, Analogue
Audio)
*[Control & Display 2](http://www.piface.org.uk/products/piface_control_and_display/)(2x16 character alphanumeric display, IR receiver, 3-position
switch, 5 tactile switches)
* Wifi-Dongle
* Cables: HDMI, USB -> USB Micro
Additionally, you will need a keyboard and a mouse for initial setup.
You can use an IDE of choice on your host PC to connect to the Raspberry Pi remotely via SSH. Visual Studio Code is recommended as it supports collaborative development using [Visual Studio Live Share](https://visualstudio.microsoft.com/services/live-share/?rr=https%3A%2F%2Fwww.google.com%2F):
1. Visual Studio with [Java Extension Pack](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack) and [Remote Development Extension Pack](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack)
1. Eclipse with Java language support and [Remote System Explorer extension](https://marketplace.eclipse.org/content/remote-system-explorer-ssh-telnet-ftp-and-dstore-protocols#group-details)