현재 froyo 안드로이드 어플에서 버튼을 누르면 NDK를 통해서 C 함수를 호출하고
이 C 함수에서 open으로 /dev/led 를 open 해 ioctl로 커널 드라이버를 제어하는 동작을
확인하고 있는 중입니다.
이 과정에서 아래 링크를 참고하여 NDK 계산기 샘플을 활용해서 테스트 중인데...
http://blog.naver.com/jupiterseas/60090691851
지금 당황스러운게 위 링크를 따라서 하면 계산기가 NDK를 통해 잘 동작하고 있습니다.
문제는 NDK 를 통해 so 모듈로 추가되어 C 함수가 실행되는 simpleCalculator.c 에서
printf 나 커널을 제어하기 위한 open, ioctl 등이 동작을 안하는것 같습니다.
당황스러운건 C 함수쪽 소스가 이렇게 되어있는데
jint Java_com_simple_calculator_CalculatorMethods_AddNumbers(JNIEnv* env, jobject this, jint front, jint back)
{
led_on();
printf("%d + %d = %d\n", front, back, (front + back));
return (front + back);
}
다른곳에 선언된 led_on 함수입니다.
void led_on(void)
{
int iFd, res = 0;
iFd = open("/dev/led", O_RDWR);
if (iFd < 0) {
printf("[LED] ERROR: Can't open device\n");
goto ERR_FD;
}
else
{
printf("[LED] dev open\n");
}
res = ioctl(iFd, IOCTL_LED_ON, NULL);
printf("[LED] Control ON\n");
if (res == E_FD)
goto ERR_FD;
ERR_FD:
close(iFd);
}
led_on의 경우는 개별적으로 gui 없는 리눅스 테스트 어플을 만들어서
커널 드라이버가 동작하는걸 확인한 소스입니다. (/dev/led를 open, ioctl 동작확인)
커널 드라이버를 제어하기 위한 led_on()이랑 printf 는 묵묵부답이면서
return 으로 전달하는 계산식은 정상적으로 리턴해서
안드로이드 App에는 계산기 결과가 정상출력이 되고 있습니다.
이런말은 NDK를 통해 C 함수도 잘 연결되었고 처리도 잘 되고 있는데
왜 제가 원하는 C 함수가 동작하지 않는건지 원인을 모르겠습니다.
C 함수의 printf 로그조차 안찍히니 뭐가 문제인지도 파악이 안되고 환장할것 같아요. ㅠ_ㅠ
커널 드라이버를 제어하기 위해 /dev/led 를 open, ioctl 하려면
뭔가 다른걸 또 거쳐줘야 하는건지 조언 부탁드립니다.




질문 올리고나서 계속 검색하면서 문제가 뭔지 뒤져보다 해결 했습니다.
자문 자답입니다.
printf 는 원래 안되는거고 __android_log_print API를 이용하니 logcat으로 로그 출력되는걸 확인했습니다.
그리고 led_on이 동작안하는 문제는 /dev/led 의 권한이 600 으로 되어있었습니다.
이걸 777 로 바꾸고 해보니 정상동작 하는걸 확인 했습니다.
이틀간 원인도 모르고 삽질하던걸 드디어 해결했습니다. 후유