[SSM 안드로이드 프레임워크 만들기 강의]
===========================================================
Inside 안드로이드 8장 <-- 강의내용에 도움될만한 서적
월 : C++ 고급문법
화 : 각종 테크닉 -> 스마트 포인터, 참조계수, 함수객체 등..
수 : 안드로이드가 사용하는 각종 디자인 기법
목 : Generic 프로그램
금 : 안드로이드 프레임워크 구현
===========================================================
JNI는 JAVA와 디바이스간의 프로세스 통신이다.
===========================================================
//#include <iostream>
//using namespace std;
////////////////////////////////////////////////////////////////////////////////////////
//1. 개념 : 인자의 갯수나 타입이 다르면 동일 이름의 함수를 2개이상 만들 수 있다.
//2. 장점 : 일관된 라이브러리를 구축 하기가 쉽다.(C를 제외한 대부분의 언어가 지원된다)
//3. 원리 : name mangling - 컴파일러가 오버라이딩을 지원하기 위해 함수 이름을 변경하는 현상.
//4. cl 소스이름.cpp /FAs 로 어셈 코드를 만들 수 있다.
//5. c와의 호환성 문제.. 헤더 작업시 조건부 컴파일 필요
//6. 함수 오버로딩은 1. 컴파일 시간 문법이다. --실행시 성능에는 문제가 없다. (단 컴파일시간이 더걸린다)
//7.
/////////////////////////////////////////////////////////////////////////////////////////
int square(int a) //컴파일러 단에서 함수와 인자값을 보고 suare_int(int a) 같이 rename 하게 된다.
{
return a*a;
}
double square(double d) // 컴파일러가 square_dobule(double) 과 같이 rename 한다.
{
return d*d;
}
int main()
{
int n= square(3); //square_int (3)
double d = square(3.1);
return 0;
}
=============================================================
cl 명령어로 cpp 파일을 어셈으로 표현해준다.
$cl 함수오버로딩.cpp /FAs
텍스트 파일로 열어보면 맹글리 된 부분을 확인 할 수 있다.
===================================================================
; 21 : int n= square(3); //square_int (3)
push 3
call ?square@@YAHH@Z ; square
add esp, 4
mov DWORD PTR _n$[ebp], eax
; 22 : double d = square(3.1);
sub esp, 8
fld QWORD PTR __real@4008cccccccccccd
fstp QWORD PTR [esp]
call ?square@@YANN@Z ; square
add esp, 8
fstp QWORD PTR _d$[ebp]
====================================================================
//square.c => 반드시 .c 파일로 만들것
int square(int a)
{
return a*a;
}
//square.h 만드드세요
int square(int);
//함수 오버로딩2.cpp 파일로 들어옴
#include "square.h"
int main(){
square(3);
}
//위처럼 3개의 파일로 작업한 후 빌드
====================================================================
에러가 출력된다.
이유?! : cpp 파일은 오버로딩을위해 함수를 맹글링한다.
하지만 .c 파일에서는 오버로딩이 지원하지 않기때문에 함수이름 그대로를 사용한다.
맹글링된 함수 주소를 참조 할 수 없다.
이를 해결하기 위해 .h 파일에 extern "C" 를 선언해주어 C처럼 컴파일 해달라고 요청하면 된다.
========================== squre.h =========================================
extern "C" int square(int);
//cpp 컴파일러에게 c 처럼 해석해 달라(name mangling을 막아달라고 요청)
==============================================================================
=> 잘 컴파일됨
이후 cpp 파일의 확장자를 .c 로 하면 string 오류가 뜬다. h 안에 extern "C" 를 못인식 하는 것이다.
이럴때는 조건부 컴파일을 해 줘야한다.
========================== square.h =========================================
#ifdef __cplusplus
extern "C"{
#endif
int square(int);
//cpp 컴파일러에게 c 처럼 해석해 달라(name mangling을 막아달라고 요청)
#ifdef __cplusplus
}
#endif
//결론 c/C++ 모두에서 사용 가능한 라이브러리를 구축하려면
//1.라이브러리 자체는 .c 로해서 name manling 을 막고
//2. 헤더는 위처럼 조건부 컴파일을 해서 c/c++ 모두를 지원해야 한다.
==============================================================================
'C,C++ > Android_FrameWork' 카테고리의 다른 글
[SSM 안드로이드 프레임워크 개발 강의]6. 객체 지향의 탄생 배경을 STACK 소스로 알아보기 (0) | 2012.08.13 |
---|---|
[SSM 안드로이드 프레임워크 개발 강의 ] 5. 참조변수 편 (0) | 2012.08.13 |
[SSM 안드로이드 프레임워크 개발 강의 ] 4. C++ 캐스팅 (0) | 2012.08.13 |
[SSM 안드로이드 프레임워크 개발 강의 ] 3. 메크로와 템플릿?! (0) | 2012.08.13 |
[ SSM 안드로이드 프레임워크 개발 강의 ] 2. 인라인 함수 (0) | 2012.08.13 |