JNI en raspberry Pi

En este pequeño tutorial veremos como implementar JNI con C en raspberry pi.

Primero que nada empezaremos explicando un poco de que es JNI, después veremos los comandos para instalar java y WiringPi, por ultimo se explicara un código ejemplo básico para iniciar.

Instalación

Para trabajar sobre raspberry pi es necesario tener previamente montando una imagen de sistema en la raspberry, haber instalado una versión de java.

sudo apt-get update && sudo apt-get install oracle-java7-jdk

WiringPi es una biblioteca de acceso a los pines GPIO escrito en C, esta nos servirá para poder trabajar sobre lectura y escritura en los pines. Para su instalación les dejare esta guía y este vídeo de apoyo.

Ahora si estamos listos para comenzar.

¿Qué vamos a hacer?

En este ejemplo prenderemos uno de los dos leds seleccionado que tenemos. Para ello crearemos una interfaz de menú en java muy simple implementando buffereader para detecte la entrada del teclado que indicara cual led se prenderá, utilizaremos la tecla 1 y 2 para ello.

La parte de código nativo lo trabajaremos con C, en este proyecto generaremos una clase que se encargara del manejo de las instrucciones en este caso valorara el led que se selecciono para encenderse y ejecutara la instrucción de encendido.

 Para este ejemplo cree una carpeta de trabajo llamada ejemplo

 mkdir ejemplo

Dentro de ella cree mi proyecto, mi clase en java se llamara PrendeLed.java y en c se llamara Estado.c.

sudo nano PrendeLed.java

Nota: Es importante quitar los comentarios del código si no les marcara errores al compilarlo.

Código PrendeLed.java:

import java.io.*;  // importar
  public class PrendeLed{ // clase
   static int led; // variable led
public static native void  Estado(int led);
public static void main(String[] args){
PrendeLed prendeled= new PrendeLed();

BufferedReader entrada= new BufferedReader(new InputStreamReader(System.in)); // lectura

try{
System.out.println ("MENU: Elige Opcion"); // Menú 
System.out.println ("1) Prender Led Uno");
System.out.println ("2) Prender Led Dos"):

led=Integer.parseInt(entrada.readLine()); // leer entrada
 }catch(IOException e){}
 prendeled.Estado(led);
System.out.println ("Encendiste el led" + led);             
}
static{
 System.loadLibrary("PrendeLed");
  }
}

Código: Estado.c

#include <jni.h>
#include <stdio.h>
#include <wiringPi.h>
#include "PrendeLed.h"
JNIEXPORT void JNICALL
Java_PrendeLed_Estado(JNIEnv *env, jobject obj, jint led) {
wiringPiSetup ();
pinMode (0,OUTPUT); // GPIO17 , PIN 11 corresponde al pin 0 ver imagen 1.0 declaramos como pin salida
pinMode (2,OUTPUT); // GPIO27 , PIN 13 corresponde al pin 2 ver imagen 1.0 declaramos como pin salida
 if (led == 1) {
 digitalwrite(0,HIGH);
 digitalwrite(2,LOW);
 delay(4000);
 digitalwrite(0,LOW);
 }
 else if (led== 2) {
 digitalwrite(0,LOW);
 digitalwrite(2,HIGH);
 delay(4000);
 digitalwrite(2,LOW);
 }
 else {
 printf("Leds Apagados:");
}
 return;
}

Comandos para compilar y ejecutar:

javac PrendeLed.java // javac     NombreDelPrograma.java
javah -jni PrendeLed // genera el h java
cc -shared -I/usr/lib/jvm/jdk-7-oracle-armhf/include -I/usr/lib/jvm/jdk-7-oracle-armhf/include/linux -o libPrendeLed.so  Estado.c -lwiringPi

// Este codigo puede darles conflictos debido a que tienen que verificar la versión de instalación de su código java en este caso es open java 7. jdk -7-oracle-armhf // tu ruta de java

export LD_LIBRARY_PATH=.  // Pexara que agarre las librerias
java PrendeLed  //nombre de tu java para ejecutar si todo está bien

 

cod

Para la conexión:

Solo ocuparemos 2 leds, 2 resistencias de 220 o similares y cables.

cir

 

Agradecimientos especiales:

Diego Motafuka colaborador.

Una respuesta a “JNI en raspberry Pi”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *