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

android ndk관련해서 질문드립니다.

0 추천
안녕하세요~ 전에 ndk와 관련해서 질문글을 올렸는데.

visual studio 환경에서 만들어진 c++프로젝트(메인cpp에서 다른cpp, h파일을 참조하는 형식)를 android에 넣으려면 unix(linux) 환경으로 먼저 바꿔주셔야 한다고 답해주셔서 각각의 cpp파일을 gcc(mingw)로 컴파일해서 메인 cpp과 링크를 시켰습니다.

그래서 exe파일이 만들어진 후 실행해 봤는데 원래의 exe파일과는 달리 에러가 나네요.. 혹시 gcc(mingw)로 컴파일 하는 과정에서 문제가 있었던 걸까요?

그리고 .so파일도 gcc(mingw)로 생성을 해야 하나요?
aaaandhelper (900 포인트) 님이 2018년 2월 4일 질문
1. gcc (mingw) 가 가 아니고 android ndk 내에 존재하는 gcc 로 컴파일 하셔야 합니다. 경로는 다음과 같습니다. ($ndk/toolchains/*)
2. 폰에 ap 가 주로 arm 계열이니 그쪽으로 변경해줘야 하구요
3. toolchain 을 어떻게 사용하는지 검색해보시고 Android.mk 또는 cmake 로 makefile 생성하시거나 gcc path 를 재정의해서 이런 저런 작업을 해야 컴파일 될겁니다. 이때 소스코드 역시 수정되어야 합니다. windows 코드로 작성된게 분명 있을 거니깐요.


ps. mingw 는 windows 용 입니다.
ps1. ndk 내에 보면 메뉴얼 경로가 있습니다. 참고하세요

NDK documentation, guides, and API reference are available on
[our website](https://developer.android.com/ndk/index.html).

NDK code samples are available on
[GitHub](https://github.com/googlesamples/android-ndk).

Information about Android Studio can be found on [the Android Studio
website](https://developer.android.com/studio/index.html).
감사합니다..  그럼 만약 MFC를 사용한다면 Linux ARM환경에 맞게 바꿔주는게 맞는거죠?
네 thread 도 다르고 File 제어도 다르고 다 다릅니다. 특히나 표준 API 가 아닌 Windows API 를 썻다면 고칠게 많죠
계속 질문드려서 죄송한데 그럼 먼저 표준 API로 코드를 수정한 뒤 gcc로 컴파일 한 후 ndk-build를 해주는게 순서겠네요?
정확히는 표준 API 라기 보다는 리눅스 API 로 하시거나 멀티를 지원하는 boost 기반으로 코딩하신 후 ndk-build 하시면 됩니다. 이때 ndk-build 는 Android.mk 를 참조합니다. (ndk 내 gcc 연동)

cmake 나 makefile 을 직접 사용시에는 ndk 내부 gcc 경로를 지정해서 빌드하면 됩니다.

이게 그냥 되는게 아니라서 처음이시면 시간좀 길게 잡아서 하셔야 됩니다.
한가지만 더 질문드리면 main.cpp에서 module.cpp의 Function을 호출하고 module.cpp에서는 a.cpp, b.cpp, c.cpp의 function을 호출하는 구조라면 각각의 cpp별로 .so를 생성해야 하나요?
아뇨 so 는 최종적으로 1개만 만드시고
module 을 .a (static build) 으로 만들어서 포함하세요
아 그러면 LOCAL_SRC_FILES에 module.cpp , a.cpp, b.cpp, c.cpp을 넣어서 먼저 .a(static library)로 생성한 다음에 main.cpp를 .so로 ndk-build할 때 LOCAL_STATIC_LIBRARIES에 앞서 생성한 .a(static library)를 추가하는 구조겠네요?
네 그렇게 하셔도 되고 꼭 모듈로 분리하지 않아도 된다면
main.cpp 쪽 LOCAL_SRC_FILES 에 몰아넣어도 됩니다.
답변해 주신덕에 감사하게도 .so 파일을 생성하였습니다. 그런데 궁금한 점이 main.cpp의 메인함수인 int main(int argc, char *argv[]) argv에 2개의 JPG파일의 경로를 파라미터로 넘겨줘야 하는데 java쪽에서는 메인 함수가 public static void main(String[] args) 이런 식으로 시작하는 걸로 알고 있는데 String[] args이 형식으로 보내면 될까요?
android 에는 main 이 따로 없으니
android 에서 처음 call 하는 부분에 인자 정보를 전달 하면 cpp 의 main 에 해당하는 method or function 를 call 하면 될듯 합니다.

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...