안녕하세요
현재 안드로이드 리눅스 포팅관련 업무를 하고 있습니다.
여기서 NFC에 관련하여 궁금한 점이 있습니다.
사용하는 NFC 모듈은 NXP사의 NP544 입니다.
커널 드라이버도 driver/nfc/np544.c 로 사용중입니다.
그리고 안드로이드 부분에서 궁금한 점이 많이 생깁니다.
우선 안드로이드 유저 영역에서 커널로 접근 하기 위해 HAL을 거쳐야 할텐데,
NFC의 HAL 이라고 생각되는 것으로는, ROOT_DIR/hardware/libhardware/include/hardware/nfc.h
하나만 보입니다.
그래서 찾아보니, ROOT_DIR/externals/libnfc-nxp/ 경로에 nfc 관련 소스들이 있고
이 파일들 중에 ioctl, read, write 등을 사용하는 것으로 보아
여기가 HAL인가보다 라고 추측 중입니다.
그리고 안드로이드 APP에서 NFC를 사용하기 위한 java api (jar)는
frameworks/base/core/java/android/nfc/ 에 위치하고 있고요.
자, 이제 궁금해 미칠거 같은게 시작됩니다.
안드로이드 소스 packages/apps/ 경로에 보면 기본 APP들이 있지요,
NFC도 이 경로에 기본 APP으로 있습니다.
그런데 이 NFC APP은 jni를 포함하고 있더군요.
소스 코드를 살펴보니, framework에 있던 nfc 관련 java api를 사용하여 구현하며,
하드웨어로 접근하기 위하여 jni를 사용하는데
jni에서 open()를 사용하는 것은, 위에서 언급했던 hardware/libhardware/include/hardware/nfc.h 의 내용을 사용하고
기타 read, wrire, ioctl은 externals/libnfc-nxp 에 있는 소스를 사용합니다.
질문의 결론!
지금 보고있는 안드로이스 소스의 경우 NFC APP에 jni가 직접 구현되어, nfc 모듈까지 제어가 가능한데,
이 과정을 모르는 일반 APP 개발자의 경우 jni없이 nfc java api만을 사용하여 APP을 개발하는 것으로 알고 있습니다.
jni 없이 어떻게 커널 영역으로 접근하는지,
그리고 혹시, 안드로이드 기본 APP인 packages/apps/Nfc 가 데몬 프로세스로 동작하는 것은 아닌지
알고 계시는 분은 답변을 부탁드립니다.
구글링 아무리 하고
자료 아무리 뒤져도 잘 못찾고 있습니다.
이상 초보 개발자의 질문이었습니다.