기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

1.5 NDK로 다음과 같은 간단한 C application을 컴파일하려고 하니 에러가 발생하더군요.


#include <stdio.h>
int main(void)
{
        printf("Hello Worldn");
}


$ /android-ndk-1.5_r1/build/prebuilt/linux-x86/arm-eabi-4.2.1/bin/arm-eabi-gcc hello.c -o hello2 -static
In file included from hello.c:1:
/android-ndk-1.5_r1/build/prebuilt/linux-x86/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/include/stdio.h:50:23: error: sys/cdefs.h: No such file or directory
/android-ndk-1.5_r1/build/prebuilt/linux-x86/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/include/stdio.h:51:24: error: sys/_types.h: No such file or directory
In file included from hello.c:1:
/android-ndk-1.5_r1/build/prebuilt/linux-x86/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/include/stdio.h:160: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'extern'
/android-ndk-1.5_r1/build/prebuilt/linux-x86/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/include/stdio.h:229: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__BEGIN_DECLS'
/android-ndk-1.5_r1/build/prebuilt/linux-x86/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/include/stdio.h:377: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__BEGIN_DECLS'
/android-ndk-1.5_r1/build/prebuilt/linux-x86/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/include/stdio.h:388: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'static'


여기서 여러가지 의문이 발생했습니다.

1. 저런식으로 ndk에 포함된 gcc를 사용하면 안되는것인가? 무엇인가 option을 더 추가해야 되는가?

2. ndk는 native source를 컴파일하지만, shared/static library만 만들수 있고, 실행가능한 application은 만들어주지 않는것인가?


구글링을 해보니 다음의 웹사이트에서 platform source에 있는 pre-compile된 gcc, bionic의 헤더와 binary로 native C application을 컴파일 하는 방법이 나와 있더군요.

http://android-tricks.blogspot.com/2009/02/hello-world-c-program-on-using-android.html


위의 웹사이트에 나와있는 스크립트를 사용하면 직접 bionic과 링크하여 컴파일 할수 있지만, 스크립트를 수정해야 하는 부분도 있고 해서, ndk를 사용하려고 하는데 의외로 ndk사용이 쉽지가 않네요.


GNU library를 사용하면 기존에 사용하던 toolchain으로 간단하게 컴파일될텐데(물론 static으로 link해야 하지만), 파일크기 문제도 있고, 또한 피치못하게 GNU license를 피해가야 할 경우가 있어 문제가 되는것 같습니다.


도움 부탁드립니다.



파일럿

2010.01.15 00:45:10
*.136.60.126

저같은 경우는 따로 NDK를 사용하지 않고

developmentpdkpndksamplessample 안에 있는 샘플을 참조하여

developmentpdkpndkconfigconfig.mk 파일을 수정하여 컴파일 하였습니다.

 

위와 같이 makefile 없이 그냥 gcc 명령만으로 컴파일하기는 쉽지 않습니다.(참조하는 header들과 library들을 모두 지정해 주셔야 합니다.)

플랫폼에 추가해서 만드시면 좀 편하긴 한데, 컴파일 속도가 좀 문제가 되죠.

 

그리고 실행 가능한 application이 apk를 말씀하시는것이라면 말씀한신대로 만들수 없습니다.

실행 가능한 바이너리와 so(shared library)만 만들수 있죠.

 

그리고 GNU library를 사용하여 컴파일 하면 android shell에선 실행이 되지 않습니다. 반드시 bionic C library를 사용하여 컴파일 하여야 합니다.

최종환

2010.01.15 00:49:46
*.82.146.170

Android.mk 파일을 다음과 같이


 15 LOCAL_PATH := $(call my-dir)
 16
 17 include $(CLEAR_VARS)
 18
 19 LOCAL_MODULE    := hello-jni
 20 LOCAL_SRC_FILES := hello-jni.c
 21
 22 include $(BUILD_EXECUTABLE)
 23 #include $(BUILD_SHARED_LIBRARY)

하시고 해당 hello-jni.c를

#include <stdio.h>

int main(void)

{

printf("Hello Birdkiller..~n");

}

 

List of Articles
번호 제목 글쓴이 날짜 조회 수sort

사용자 로그인