배고픈 개발자 이야기

[Android Studio] 기존 프로젝트(eclipse) 가져와서 JNI(NDK) 빌드하기 본문

언어/Android Studio

[Android Studio] 기존 프로젝트(eclipse) 가져와서 JNI(NDK) 빌드하기

이융희 2019. 11. 29. 18:24
728x90

서론 : 기존에 eclipse project로 구성된 프로젝트를 Android Studio로 가져와 사용할 일이 생겼으므로 제목과 같이 환경설정을 시작하게 되었습니다.

 

다음 공식 문서를 참고하여 가져오도록 합니다

안드로이드 스튜디오로 이전 - https://developer.android.com/studio/intro/migrate#migrating_from_eclipse

 

본문 :

1. import project

위와 같이 Android Studio를 시작하는 화면에서 import project를 선택해 기존 프로젝트 위치를 잡아 Android project로 생성합니다.

 

jni를 네이티브 라이브러리로 가져와 Gradle에 CMake 또는 NDK-build를 사용하기 위해 다음 지침을 따릅니다. - https://developer.android.com/studio/projects/gradle-external-native-builds.html

 

Gradle을 네이티브 라이브러리에 연결  |  Android Developers

Android 스튜디오의 Gradle에 관해 자세히 알아보세요.

developer.android.com

네이티브 소스용 빌드 스크립트가 없다면 계속하기 전에 CMake 빌드 스크립트를 생성해야 합니다.

저는 Android.mk / Application.mk의 ndk-build 스크립트로만 빌드하므로 CMakelist.txt의 구성요소가 필요하지 않습니다.

 

프로젝트를 가져오면 다음과 같은 에러가 뜨는데

다음과 같이 최상위 build.gradle에 두줄을 추가해 줍니다.

그러면 또 다음과 같은 에러가 뜨는데

현재 안드로이드 스튜디오 Gradle의 버전과 속성값이 맞지 않아서 발생하는 문제로

에러에서 말하는 버전을 확인한 후 Gradle Scripts -> gradle-wrapper.properties 파일을 열어서

하단에 위와 같은 버전으로 바꿔주면 됩니다.

 

다음으로 Gradle에 빌드스크립트를 다음 그림과 같이 링크해줍니다.

정상적으로 링크가 되었다면 자동으로 Gradle파일이 수정되고 Sync되었을 겁니다.

하지만 저는 그냥 넘어가지 않고 에러가 나네요..

 

NDK 빌드시 오래된 ndk의 경우 arm용, x86용, mips용 각각 따로 빌드하는걸 지원했으나, 최신 NDK의 경우 전부 빌드하도록 강제하고 있는데, 실제 프로젝트에서 armeabi-v7a용 빌드만 지원해서 발생한 오류 코드입니다.

 

해결 방법은 NDK를 오래된 버전으로 바꿔서 돌리던지, abifilter를 설정해 arm만 빌드하게 변경 해주면 된다고 하는데 필터의 경우 추가옵션이 필요한것 같아 필자는 ndk버전을 r12b버전으로 낮추어 해결하였습니다.

 

초록색만 뜨니 아주 기분이 좋네요~^^

 

Eclipse ADT에서 Android Studio로 프로젝트를 가져오면서 생기는 요약정보인 import-summary.txt에 나타난 모든 문제를 해결하여 프로젝트 구조 조정 및 가져오기 프로세스를 올바르게 완료되도록 해야한다고 합니다.

이로써 Android Studio에 프로젝트 이전을 마치고 다음단계로 넘어갑니다.

 

 

[다음단계](https://developer.android.com/studio/intro/migrate#next_steps)

[앱빌드 및 실행](https://developer.android.com/studio/run/index.html)

 

 

디바이스를 연결하고 Run을 하였는데 또 에러가 난다 ㅜㅜ

포기할 수 없어..

구글에 검색해보니 이미 같은 packeage name을 가진 apk가 있는데, 설치된 apk와 설치할 apk의 keystore가 다르다는 내용이라고 한다.

같은 앱이니 keystore signing을 한 후에 설치를 시도해야겠다.

 

앱에 서명을 하는 방법은 다음을 따라가자

https://developer.android.com/studio/publish/app-signing

 

앱 서명  |  Android Developers

앱 서명 및 보안과 관련된 중요한 개념을 알아보고, Android 스튜디오를 사용하여 Google Play에 출시하기 위해 앱에 서명하는 방법과 Google Play 앱 서명을 선택하는 방법을 알아보세요.

developer.android.com

앱서명 같은경우 [project structure] -> [Modules] -> app -> release옵션에 적용해 주었다.

https://pr0gr4m.tistory.com/1

 

NDK를 이용한 애플리케이션 만들기 (CMake)

과거 안드로이드 스튜디오에서 NDK를 이용하여 애플리케이션 만드는것이 쉽지만은 않은 일이었지만 안드로이드 스튜디오 2.2버전부터는 CMake를 이용하여 매우 쉽게 NDK를 사용할 수 있게 되었습니다. 사실 프로젝..

pr0gr4m.tistory.com

또한 다음 과정을 통해 서명된 apk를 만들어내었다.

https://developer.android.com/studio/publish/app-signing#sign-apk

 

앱 서명  |  Android 개발자  |  Android Developers

앱 서명 및 보안과 관련된 중요한 개념을 알아보고, Android 스튜디오를 사용하여 Google Play에 출시하기 위해 앱에 서명하는 방법과 Google Play 앱 서명을 선택하는 방법을 알아보세요.

developer.android.com

성공적으로 빌드하고 install하였으나 실행중

android:name="android.permission.WRITE_MEDIA_STORAGE"으로 인해 정상적으로 동작하지 못하였다.

확인해보니 system apps에서만 부여받을 수 있는 권한이라는것...

 

따라서 system app으로 빌드하는 방법을 알아보도록 한다.

 

위 에러를 해결하지 못했는데 알고보니 build variant를 release로 했어햐 했는데 debug로 해놓고 빌드해서 생긴 문제였다

 

 

 

NDK tutorial 볼만한 글

https://pr0gr4m.tistory.com/3?category=714122%EF%BB%BF

 

NDK를 이용한 애플리케이션 만들기 (ndk-build)

이 전 포스트에서 안드로이드 스튜디오 2.2 상위 버전에서 CMake를 이용하여 애플리케이션 만드는법을 알아보았습니다. 프로젝트 생성하는데 있어서는 Wizard에서 C++ Include에 체크만 해주면 프로젝트 스켈레톤..

pr0gr4m.tistory.com

 

 

 

 

 

 

 

 

 

 


잘못 들어갔었던 항로

 

본문 :

공식 문서 가이드

기존 eclipse 프로젝트는 Gradle을 사용하지 않고 maven등의 다른 빌드 시스템을 사용하였기 때문에 Gradle과 호환될 수 있도록 intelliJ 프로젝트를 수정합니다.

 

 

Gradle 기반이 아닌 IntelliJ 프로젝트 가져오기

다음과 같은 두가지 옵션이 있습니다.

저는 [새로운 빈 프로젝트를 생성하여 이전]을 따라하였습니다.

 

적절한 위치에 프로젝트를 옮기고, compileSdkVersion 19 / minSdkVersion 19 / targetSdkVersion 19등 필요에 따라 수정하였습니다.

 

9. Dependencies를 클릭하고 Gradle 종속성에 따라 프로젝트에 라이브러리를 추가하라고 하는데 아직 Gradle 추가 옵션에 대해서 확실하지 않으니 추후에 검토합니다.

 

발생했던 오류:

1. targetSdkVersion을 19로 맞췄더니 google에선 26이상을 권고 한다고 하였습니다. 하지만 19 버전만을 target으로 사용할 것이므로 //noinspection ExpiredTargetSdkVersion 옵션을 추가합니다.

 

2. 기존 eclipse의 AndroidManifest.xml에 minSdkVersion 19 / targetSdkVersion 19이 정의되어 있었는데 안드로이드 스튜디오에선 해당파일에 선언되어 있으면 안된다는 오류메시지가 발생합니다. build.gradle에도 정의되어 있으므로 해당라인을 제거합니다.

+android:debuggable="false" 옵션은 release일 때와 debug일 때 자동으로 선언되므로 삭제해줍니다.(오히려 잘못 선언되면 에러가 날 수 있음)

 

이로써 Gradle과 호환될 수 있도록 intelliJ 프로젝트를 수정을 완료하였습니다.

 

 

다시 이전을 위한 작업을 https://developer.android.com/studio/intro/migrate#android_studio_basics부터 시작해보겠습니다.

 

 

 

 

 

Comments