Overview

바로 이전 글에서 ADB로 hacktHAL 관련 파일을 BBB에서 구동되는 Android image에 넣고, ADB Shell을 이용하여 GPIO를 컨트롤해보았다.

2019/12/18 - [안드로이드 임베디드/Android for the BeagleBone Black] - BeagleBone Black에서 GPIO Control 하기

 

BeagleBone Black에서 GPIO Control 하기

하기와 같이 지난 번에 Window10에서 ADB를 이용하여 BeagleBone Black(BBB)에 PacktHAL 파일들을 넣었다. 2019/12/12 - [안드로이드 임베디드/Android for the BeagleBone Black] - Window10에서 ADB Tool을 이용..

decdream08.tistory.com

이번에는 제목 그대로 Eclipse ADT를 이용하여 실제 Android App을 만들어 BegaleBone Black(BBB)의 GPIO를 컨트롤 하려고 한다.

지난번과 동일하게 Header P9의 핀11(P9.11)과 핀13(P9.13)을 각각 Mode7 설정으로 GPIO30과 GPIO31로 사용할 예정이다.

GPIO를 Control 하기위해서는 PacktHAL(muxed GPIO)을 안드로이드앱에 포함시키는 작업을 해야한다. 그러기위해서는 PacktHAL은 공유된 라이브러리로 .apk 파일 안에 앱과 함께 넣어져야 하며, 공유된 라이브러리로 PacktHAL을 만들려면  java code와는 별도로 분리하여 build를 실행해야 한다.

즉, PacktHAL code는 C native code로 구현됐기에, Android NDK 내부에 제공된 특정 hardware architecture(ARM) Tool chain을 이용하여 build 된다.

참고로, 이렇게 build된 C native code는 Java Native Interface(JNI)를 통해 앱의 Java code에 의해 호출이된다. JNI는 C 데이터 타입을 Java 데이터 타입으로 또는 그 반대로 번역을 해주는 역할을 한다.

Android NDK 다운로드

PacktHAL code를 컴파일 하기 전에, Android NDK를 다음 링크를 이용하여 Download 받아야 한다.

https://developer.android.com/ndk/downloads?hl=ko

 

NDK 다운로드  |  Android NDK  |  Android Developers

개발 플랫폼에 맞는 NDK 패키지를 선택합니다. NDK 최신 버전 및 이전 버전의 변경사항에 관한 정보는 NDK 업데이트 기록을 참조하세요. 안정적인 최신 버전(r20) 플랫폼 패키지 크기(바이트) SHA1 체크섬 Windows 32비트 android-ndk-r20-windows-x86.zip 814417431 b605f7e2e7585af2fc9d59fe9ddad86b64b2bf03 Windows 64비트 android-ndk-r20-windows-x86

developer.android.com

링크가 걸린 페이지를 열고, 제일 밑으로 가면 이전 Version의 NDK를 다운로드 받을 수 있다. 하기의 빨간 네모 안 참고.

최신 버젼이 아닌 이전 버젼을 다운로드 받으려는 이유는, NDK r17 부터 armeabi(ARM v5) 지원을 중단했기 때문이다.

우리가 사용 할 BBB의 Arm core에 대한 지원이 되지 않기때문에, 이전 버젼을 다운받는 것이다.

여튼, 'NDK 자료실'을 클릭하면 하기와 같이 빨간색 네모 안의 '약관에 동의합니다'를 선택한다.

그러면, 여러가지 버젼을 다운 받을 수 있는 곳으로 이동한다. 여기서 본인은 Window10용 Android NDK, 버전 15c를 다운 받았다.

Download 받은 압축된 파일을 PC의 적당한 곳에 풀어 놓았다.

NDK 압축을 해제한 폴더에 SPI 드라이버에 대한 Header 파일을 넣어 두어야 한다. 해당 Header 파일은 첨부 파일로 넣어 두었으니 참고하면 되겠다.

spi.zip
0.00MB

SPI에 대한 Header 파일을 NDK가 깔려있는 위치에서(본인은 'D:\02_Dev_Tools\01_Android\android-ndk-r15c' 이다) 서브 디렉토리인 다음과 같은 경로로 옮기면 된다.

NDK가 있는 폴더\android-19\arch-arm\usr\include\linux

참고로, android-19를 사용하는 이유는 BBB에 올라가 있는 Android version이 Kitkat이고 그에 대한 API Level이 19이기 때문이고, arch-arm인 이유는 BBB의 CPU core가 ARM이기 때문이다.

정상적으로 잘 따라 했다면, linux 폴더에 spi 폴더가 생성이되고, spi 폴더 안에 spidev.h 파일이 있을 것이다.

 

PacktHAL 컴파일

자, 이제 PacktHAL code를 컴파일 하고, 그리고 나서 라이브러리 형태로 앱에 포함하는 것을 연습해 보겠다.

1. eclipse를 열어 'File → New → Android Application Project'를 선택하여 새로운 프로젝트를 하나 만들고, 그 프로젝트 경로를 잘 숙지한다. 본인은 경우는 그 경로는 'D:\02_Dev_Tools\01_Android\eclipse_workspace\myapp\jni'이다.

2. PacktHAL 폴더 안에 jni 폴더를 복사하여 #1에서 만든 프로젝트 경로에 붙여 넣기 한다. 참고로 jni 폴더는 첨부 파일로 넣어 두었으니 참고하면 되겠다. 또 참고로, jini 폴더 안에 있는 파일은 하드웨어를 access하기 위해 만든 c파일들이다.

jni.zip
0.01MB

3. Window에서 CMD 창을 열고 #1에서의 프로젝트 경로로 이동 한후, #2에서 복사한 jni 폴더로 이동을 한다.

4. 해당 디렉토리에서 Andorid NDK를 이용하여 PacktHAL을 빌드한다. 빌드하는 방법은 Android NDK 경로에 있는 ndk-build를 호출하면 된다. 따라서 본인의 경우는 ndk-build가 있는 경로가 'D:\02_Dev_Tools\01_Android\android-ndk-r15c\ndk-build"이므로, 하기와 같이 입력을 하였다.

이제 컴파일이 제대로 되었는지 확인을 해보자.

안드로이드 프로젝트를 생성한 폴더에서 'libs' 폴더를 들어가 보면 여러 개의 폴더가 생성된 것을 알수가 있다. 눈치가 빠른 사람이라면 우리가 jni를 NDK로 컴파일 할때 나온 메세지들과 관련된 폴더들이라는 것을 알 수 있을 것이다.

우리 Target board인 BBB에 해당 되는 TArget은 'ameabi'이므로, 그 폴더에 들어가서 'libpacktHAL.so' 파일이 하기와 같이 정상적으로 생성되었는지를 확인하면 된다.

이 라이브러리를 Android Project에 넣어 사용하면, 실제 안드로이드 앱에서도 라이브러리 안에 jni 폴더의 c 파일들을 이용하여 하드웨어를 제어 할 수 있게된다.

- 계속...

+ Recent posts