기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
안녕하세요. 안드로이드의 모든것 NDK라는 책을 정말 감사히 읽고 있습니다.
5장의 자바 애플리케이션에서 GPIO 컨트롤하기 부분을 참조하여 타겟보드의
LED를 control 해보고자 노력중입니다만 난독증이 있는지.. 책과 같은 결과물이
나타나질 않아 문의를 드리고자 합니다.
source code는 이솝 게시판의 예제 자료가 책과 동일함을 깨닫고(감격..) 그대로
사용중에 있습니다만, 첫번째 문제는 컴파일에서 만나볼 수 있었습니다.
책의 내용에는
android$ source ./build/envsetup.sh
android/external/gled$ mm
으로 컴파일 시 세개의 파일이 새로 생성된다고 나와 있습니다만...
제가 컴파일해보면 다음과 같은 message만 나타납니다.
jhkim@jhkim-desktop:~/dev/V210/gingerbread/external/gled$ mm
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.3.1
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=GINGERBREAD
============================================
make: Entering directory `/home/jhkim/dev/V210/gingerbread'
target Non-prelinked: libled (out/target/product/generic/symbols/system/lib/libled.so)
make: *** No rule to make target `out/target/product/generic/system/lib/liblog.so', needed by `out/target/product/generic/system/lib/libled.so'. Stop.
make: Leaving directory `/home/jhkim/dev/V210/gingerbread'
jhkim@jhkim-desktop:~/dev/V210/gingerbread/external/gled$
liblog.so를 참조할 수 없다는식으로 이해됩니다만, libled, ledservice, libledclientjni의 폴더에서 각각 컴파일을
하면 어떻게든 세개의 파일을 확보 할 수 있었기에(정상적인 파일인지 의문입니다만..) 다음 단계를 진행해보고자
하였습니다만... 여기서 두번째 난관에 부딪혔습니다.
"이제 코드를 모두 작성했으니 다음과 같이 컴파일해서 모두 타겟에 설치하자." 라는 책의 설명 부분입니다...
난독증이 꽤 심한지라... 한참을 아래 box의 out/target/product/에 origen 폴더는 없는데... 하며 삽질하다가,
Target Board의 system/ 밑에 lib와 bin 디렉토리가 있음을 찾아내고... 이곳에 넣으라는 설명이셨구나;; 하고
깨달았습니다만... 어떤 방법으로 타겟보드에 집어넣는지를 모르는지라 또 한번 막혀버렸습니다 하하;;
아무쪼록... 초보의 무한 삽질에 조그마한 도움을 좀 부탁드립니다.
읽어주셔서 감사합니다 (_ _)
댓글 감사드립니다. Full build에 대한 조언을 주셔서 잽싸게 make를 하여보았습니다.
이후 예제 source를 컴파일하여 보니 이전과는 다른 모습을 보였습니다.
make: Entering directory `/home/jhkim/dev/V210/gingerbread'
target Non-prelinked: libled (out/target/product/generic/symbols/system/lib/libled.so)
Install: out/target/product/generic/system/lib/libled.so
target Non-prelinked: ledservice (out/target/product/generic/symbols/system/bin/ledservice)
Install: out/target/product/generic/system/bin/ledservice
target Non-prelinked: libledclientjni (out/target/product/generic/symbols/system/lib/libledclientjni.so)
Install: out/target/product/generic/system/lib/libledclientjni.so
make: Leaving directory `/home/jhkim/dev/V210/gingerbread'
위와 같았습니다만.. Non-prelinked 도 보이고.. 여전히 정상적인 컴파일은 안되었습니다.
log의 libled.so, ledservice, libledclientjni.so는 모두 생성되어 해당 링크에 있음을 확인은 하였습니다만..
무엇이 부족했던걸까요?
NDK 책관련 문의 게시판에 올렸어야 하는 글을... 이곳에 올린게 계속 밟히네요 ㅠㅠ 죄송합니다...
새로 문의글을 작성할까 하다가... 오히려 혼잡스러울것 같아서 문의를 이어갑니다.
Non-prelinked는 여전합니다만, 말씀하신데로 컴파일되어 생성된 File들은 설치가 되었습니다.
이에 드라이버 코드의 내용(이 부분은 책과 업로드된 예제가 많이 상이했습니다) 중 GPIO를 타겟에
맞추어 수정하고 컴파일하여 gmod.ko까지 설치를 완료하고, 테스트를 진행해 보았습니다.
그런데... 다시 막히고 말았습니다.
타겟보드에 실행된 테스트 애플리케이션에서 제어를 해보고자 On, Off 를 터치하면 아래와 같은
로그가 나타나며 잠시 뒤 애플리케이션이 자동적으로 종료되어버립니다.
ServiceManager(457): Waiting for service hybridego.LED...
ServiceManager(457): Waiting for service hybridego.LED...
ServiceManager(457): Waiting for service hybridego.LED...
ServiceManager(457): Waiting for service hybridego.LED...
ServiceManager(457): Waiting for service hybridego.LED...
LED::getLEDService 0x112700
LEDService not published, waiting...
살펴보면... getLEDService( )에서 Binder가 체결되지 못했다는 내용 같습니다만... 원인을 모르겠습니다.
조언 좀 부탁드리겠습니다.
에러 로그를 보시면 libled.so를 build 하기 위해서 liblog.so 가 필요한데 없다는 말입니다.
liblog.so 는 log를 뿌려주는 로그인데. 저게 없다는 것은 안드로이드 Full build가 한번도 되어 있지 않아서 liblog.so가 생성되지 않았거나. 혹은 libled.so를 만들기 위한 Android.mk 가 잘못되어서 참조하지 못하는경우의 두가지 경우로 볼 수 있습니다. 하지만 후자는 가능성이 적고요.
한번도 Full build를 안하신게 아닌가... 합니다.
아무튼 두번쨰 케이스일 경우 대충 뚜드려 맞추시거나 log를 사용하는 부분을 다 뺴시던가 하는 방법이 있습니다.
그리고 타겟에 올릴때는 adb remount로 system 파티션의 read only 를 read write로 바꿔주신 다음에
adb push 명령어로 올리시면 됩니다.