piątek, 2 stycznia 2015

Wywołanie C z Javy - JNI na przykładzie czujnika temperatury DHT11

W poprzednim wpisie na blogu pokazałem jak przygotować bibliotekę SO i wywołać metody w javie wykorzystując Java Native Interface. Poniżej przedstawiam bardziej rozbudowany przykład gdzie klasa C odwołuje się dodatkowo do biblioteki wiringPi. Dzięki temu będę mógł z poziomu Javy wywołać metodę w C odczytującą temperaturę z czujnika DHT11.

Pierwsze kroki jakie należy wykonać są dokładnie opisane w poprzednim artykule. Różnica jest przy kompilowaniu i tworzeniu pliku SO (shared object - objekt współdzielony, odpowiednik windowsowego pliku DLL).

W celu kompilacji wywołujemy kod:
gcc -fPIC -c DHT11.c -I $JAVA_HOME/include -I /usr/local/include/


Należy upewnić się, że mamy ustawioną zmienną środowiskową JAVA_HOME.
Aby to sprawdzić należy wywołać:
echo $JAVA_HOME

Jeśli zostanie zwrócony pusty wynik to trzeba ustawić tą zmienną przez polecenie:
export JAVA_HOME="scieżkaDoJavy"


Po wywołaniu powyższej komendy kompilacji zostanie utworzony plik DHT11.so. Następnie wywołujemy:
gcc DHT11.o -shared -o libDHT11.so -Wl,-soname,DHT11 -L/usr/local/lib -lwiringPi

gdzie:
-o - nazwa pliku wynikowego, musi być z przedrostkiem "lib", nazwa musi się zgadzać z nazwą w klauzuli System.loadlibrary() w Javie
-L/usr/local/lib - ścieżka gdzie szukać skompilowanego kodu źródłowego biblioteki (plików obiektowych)
-lwiringPi - linkujemy do kompilatora bibliotekę wiringPi - wcześniej należy ją zainstalować zgodnie z instrukcjami ze strony http://wiringpi.com/download-and-install/

Jeśli nie dodamy -L/sciezka -lwiringPi to będziemy mieli do czynienia z błędem:
java: symbol lookup error: ..../libDHT11.so: undefined symbol: pinMode


Zostało sprawdzenie czy wszystko działa:
java -Djava.library.path=. DHT11


I na ekranie konsoli uzyskamy odczyt temperatury z czujnika DHT11

Brak komentarzy:

Prześlij komentarz