Android NDK 개발환경 구축

Android NDK 개발 환경 구축

Android 앱에서 C나 C++코드를 사용하기 위하여 Android NDK를 써야 한다.
아래는 Android NDK의 개발 환경 구성 방법을 설명한다.

크게 아래의 세가지를 설치할 것이며, Linux 64bit에서 진행했다.

IDE 다운로드 : Android Studio
SDK 다운로드 : Android Studio에 포함
NDK 설치 : SDK Tools

[IDE 설치]

  1. 알맞은 Java를 설치한다. Oracle JDK 8이 현재 제일 좋은 버전임
1
2
3
4
$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
  1. Ubuntu 64bit에 32bit 라이브러리가 누락되어 있으므로 추가 설치해준다.
1
$ sudo apt-get install lib32z1 lib32ncurses5 lib32stdc++6
  1. 아래 경로에서 Android Studio를 다운로드하고 설치한다. (현재 최신은 2.3.3임)
    https://developer.android.com/studio/index.html?hl=ko

    image(/images/Android-NDK/01.png)
  2. 다운로드한 후에 적당한 경로에 압축을 풀어둔다. (아래 예제에선 ~/Android/ 에 해제함)
1
$ unzip ./android-studio-ide-*.zip -d /opt/
  1. 아래 명령어로 실행한다.
1
$ sh /opt/android-studio/bin/studio.sh
  1. 최초 실행 완료 뒤 창에서, 오른쪽 하단의 Configure->Create Desktop Entry를 선택하면 바로가기가 생성된다.

    image

[NDK 설치]

  1. Android Studio를 실행하고, 아래 창과 같이 SDK Manager를 실행한다.

    image
  2. Android SDK에서 “CMake”와 “NDK”를 설치한다

    image
  3. JNI 샘플 프로젝트를 다운로드하고, 연다.

    image

    image

    image
  4. 프로젝트가 열리면, 플러그인 업데이트와 설치를 진행한다.
    Gradle 에러로 필요한 것을 설치하라고 표시될 것인데, 클릭 하여 쉽게 설치할 수 있을 것이다.

    image

    image

*) CAP에서 실행하기 위해서는, build.gradle에서 minSdkVersion 을 22로 변경한 후에, 프로젝트를 Sync한다.

image

image

  1. NDK를 이용하여 JNI 샘플 앱이 빌드되는 것을 확인할 수 있다.

    [신규 NDK 프로젝트 생성]

  2. 아래와 같이 새 프로젝트를 생성한다.

    image
  3. 앱 이름 등을 알맞게 입력하고, “Include C++ support”를 체크 한다.

    image
  4. 원하는 대로 설정한다.

    image
  5. “Add No Activity”를 선택한다.
    (참고로 Activity를 선택해서 프로젝트를 만들면, 샘플 코드까지 자동으로 생성 해준다)

    image

    image

    image
  6. 생성되어 있는 native-lib.cpp 파일에 아래와 같이 입력한다.

    image

    image
1
2
3
4
5
6
7
8
9
10
11
12
#include <jni.h>
#include <string>

extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */
) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}

JNIEXPORT 매크로로 jni에 visibility를 지정하고, jstring으로 리턴하는 것을 써주며, 함수의 이름은, 순서대로 “Java_” 접두사를 붙이고 패키지명을 붙이고, 클래스의 이름을 포함해야 한다.

따라서 아래를 풀이하자면 다음과 같다.

-> 접두사 Java_ + 패키지명 com.example.wjshin.myndktest + 클래스명 MainActivity + 함수명 stringFromJNI

1
2
JNIEXPORT jstring JNICALL
Java_com_example_MainActivity_stringFromJNI
  1. 왼쪽의 패키지 명에 오른쪽 클릭해서 File->New->Activity->Empty Activity를 선택하면 Activity 생성 창이 나오는데, “Launcher Activity”를 체크해서 생성한다.
    (위 사진에서는 com.example.wjshin.myndktest)

    image

    image
  2. 생성된 Activity의 Java 코드에 아래와 같이 입력해준다.

    image
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.example;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Log.d("MyNDKTest", stringFromJNI());
}

static {
System.loadLibrary("native-lib");
}

private native String stringFromJNI();
}

아래 코드로 native-lib라는 이름의 라이브러리를 로드하고

1
2
3
static {
System.loadLibrary("native-lib");
}

아래 코드로 stringFromJNI를 native 함수로 선언한다.

1
private native String stringFromJNI();
  1. Run ‘app’ 으로 앱을 실행하면, 안드로이드 로그가 정상적으로 출력되는 것을 확인할 수 있다.

    image

[기존 프로젝트에 NDK 추가]

  1. 일반적인 안드로이드 앱 프로젝트를 생성한다.

    image

    image

    image

    image
  2. 일반 프로젝트의 왼쪽의 Project 탭에서, 드롭박스 중 Project를 선택한다.

    image
  3. app/main 폴더에 오른쪽 클릭 후 New->Directory 를 선택하여 cpp 폴더를 만든다.
    (폴더 명은 중요하지 않음)

    image

    image
  4. 생성한 폴더에 오른쪽 클릭한 후, New->C/C++ Source File 을 선택하여 cpp 파일을 만든다.
    (파일 명은 중요하지 않음)

    image

    image
  5. 생성된 cpp파일에 테스트용 코드를 입력

    image
  6. app 폴더에 오른쪽 클릭한 후, New->File 을 선택하여 CMakeLists.txt 파일을 생성
    (app 폴더 외 다른 폴더도 가능)

    image

    image
  7. 아래와 같이 “native-lib”라는 이름의 라이브러리를 상대 경로의 파일 src/main/cpp/native-lib.cpp로 추가

    image
  8. 프로젝트 좌측의 Project 탭에서 Android를 다시 선택한다.
    CPP 라이브러리와 연결하고자 하는 클래스를 오른쪽 클릭한 후, “Link C++ Project with Gradle”를 선택하여, CMakeLists.txt 파일을 선택하면 앱 모듈과 라이브러리가 연결된다.

    image

    image

연결 전)

image

연결 후)

image

  1. Java Activity에 아래와 같이 코드를 추가하여 잘 동작하는 것을 확인한다.

    image
    ![image](/images/Android-NDK/42.png)

참고

https://developer.android.com/ndk/index.html

https://developer.android.com/studio/projects/add-native-code.html

https://code.tutsplus.com/ko/tutorials/how-to-get-started-with-androids-native-development-kit–cms-27605

Android에 Native Library를 내장

https://source.android.com/devices/tech/config/namespaces_libraries.html

공유하기