마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 ndk 라이브러리 질문드립니다

0 추천
c++로 구현된 코드를 ndk 환경에서 사용하려하니

 

windows.h 등 일부 지원되지 않는 부분들이 있어

c++ 코드를 라이브러리 화 하여

 

ndk 코드에서 함수로 불러와 사용하려고 합니다.

 

c++코드를 정적 라이브러리화 하여 *.lib 형식으로 저장을 했는데

 

이를 비쥬얼스튜디오 2008에서

#pragma comment(lib,".***.lib") 형식으로 헤더에서 불러와 사용하니 잘 불러와지는데

 

ndk 상에서 불러오지를 못하네요..

 

라이브러리화 한 함수에대해서

undefined reference to '***::FUNCTION()' 오류가 뜹니다

 

어느부분이 잘못된걸까요? 어떻게 해결해야하는지도 조언부탁드립니다
익명사용자 님이 2015년 9월 1일 질문
2015년 9월 1일 수정

1개의 답변

0 추천
음 일단 안드로이드에 대해서 생격하셔야하는데요. 안드로이드의 속내를 보신다면 리눅스 커널에 달빅 vm으로 구성된 시스템입니다.

따라서 이건 위도우용 으로 컴파일된 라이버러리는 바이너리 수준에서 벌써 호환성이 맞지 않습니다. 따라서 비쥬얼스튜디오의 컴파일러는 사용할수 없습니다.

그래서 ndk내부에 보시면 gcc계열의 컴파일러가 존재합니다.

따라서 ndk-build를 이용해서 컴파일하셔야 안드로이드에서 사용할수 있는 라이버러리를 만드실수 있을 것입니다.

보통 xxxxx.so 파일로 만들어 질겁니다.

또 window.h 는 ms-window용으로 만들어진 것으로 다른 OS를 지원하지 않습니다. 따라서 사용불가지요.

즉 소스 레벨에서 OS의존성을 베제하셔야합니다. 또한 window가 제공하는 API도 사용하시면 않됩니다.

ansi c에서 표준으로 지정된 것들을 위주로 만드시고 ansi c++ 베이스로 하셔야 하지만 여기도 제약사항이 있습니다. 아드로이드 ndk에서 제공하는 c++라이버러리는 ansi-c++의 전부를 지원하지 못하고 일부만을 지원하는데 이것은 ndk 사이트들을 참조하시면 알수 있을 것입니다. 거의 수준이 c수준정도만 지원하다고 생각하시면 맘편할 것입니다.

명심하셔야할 것은 안드로이드는 윈도가 아니므로 윈도전용의 것들을 사용해서는 안드로이드에서 동작하지 않는 다는 것입니다.
컴러기 (22,230 포인트) 님이 2015년 9월 1일 답변
답변 감사합니다!

그렇다면 비쥬얼 스튜디오에서 만든 lib 파일은 사용이 불가능 하고

라이브러리화 하는 파일에 윈도우 os에 포함된 헤더 등을 사용하는 경우는
gcc 컴파일러를 활용해 so 파일로 만들수 없기 때문에

코드상에서 전부 제외해야 하는건가요?
네!
근데 막제외하다보면 정의되지 않은 것들이 생기니 제외 보다는 변경이 더 맞겠지요.
없으면 만들어야 하니까요..
...