유혁의 개발 스토리

[Android] NDK를 이용한 C/C++ 연동 개발 본문

Android

[Android] NDK를 이용한 C/C++ 연동 개발

유혁. 2017. 11. 30. 14:06

 

NDK란 무엇인가?

 

  Android NDK는 C와 C++ 같은 네이티브 코드 언어를 사용하여 앱의 일부를 구현하는 도구모음입니다. 어떤 유형의 앱에서는 네이티브 코드 언어로 작성된 코드 라이브러리를 재사용하는 데 도움이 됩니다. 이해를 돕기위해서 C언어의 Math.h 라이브러리를 이용하는 것과, Java의 Math 클래스를 이용할 때 두가지 중에 C언어로 제작된 라이브러리가 더 높은 효율을 가지고 있다면 NDK를 이용하여 Math.h 라이브러리를 이용하여 효율적인 앱을 만들 수 있습니다. NDK의 장점으로는 속도향상, 유연한 프로그램 개발 가능하며 실제 안드로이드 2D/3D OpenGL 관련 영상처리 라이브러리들은 대부분 NDK(Native Development Kit)를 이용해 개발이 됩니다.

  JNI(Java Native Interface)는 JAVA와 C/C++ 라이브러리를 연동시켜주는 Interface 이며, JNI를 이용하여 안드로이드 개발에 NDK를 이용할 수 있습니다.

 

 

JNI를 이용한 NDK 연동

 

테스트 환경 : Android Studio 2.3 (2.2버전 이상부터 JNI 연동 방식 변경)

 

 

 

안드로이드 프로젝트를 새로 만들어 줍니다. New Project 에서 어플리케이션 이름입력 후 아래 CheckBox Include C++ support를 체크하고 Next로 넘어갑니다. 다음 설정방법은 동일하며 Next로 끝까지 넘어가 Customize C++ Support 부분에서 디폴트 상태로 Finish 해줍니다. 프로젝트 로딩시간이 다소 길어 기다려주시면 됩니다.

 

기존의 프로젝트와 동일하지만 cpp라는 폴더와 CMakeLists.txt가 추가 되었습니다.

제가 기존에 셋팅을 해 두어서 자동으로 설정이 된 것인지 확인이 안되어,

 

SDK Tools에서 CMake, LLDB, NDK 를 설치합니다.

 

CMake : Gradle과 함께 작동하여 네이티브 라이브러리를 빌드하는 외부 빌드 도구.

LLDB : Android Studio가 네이티브 코드를 디버그하는데 사용하는 디버거.

 

기본설정을 완료하였습니다. 이제 테스트 해 봅시다.


 MainActivity.class

package com.yoohyeok.ndk_test;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

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

        // Example of a call to a native method
        TextView tv = (TextView) findViewById(R.id.sample_text);

        tv.setText(stringFromJNI());
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();
}
 

 

native-lib.cpp

#include <jni.h>
#include <string>

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


 

 Android NDK는 C와 C++ 같은 네이티브 코드 언어를 사용하여 앱의 일부를 구현하는 도구모음입니다. 어떤 유형의 앱에서는 네이티브 코드 언어로 작성된 코드 라이브러리를 재사용하는 데 도움이 됩니다. 이해를 돕기위해서 C언어의 Math.h 라이브러리를 이용하는 것과,&nbsp;Java의 Math 클래스를 이용할 때 두가지 중에 C언어로 제작된 라이브러리가 더 높은 효율을 가지고 있다면 NDK를 이용하여 Math.h 라이브러리를 이용하여 효율적인 앱을 만들 수 있습니다. NDK의 장점으로는 속도향상, 유연한 프로그램 개발 가능하며 실제 안드로이드 2D/3D OpenGL 관련 영상처리 라이브러리들은 대부분 NDK(Native Development Kit)를 이용해 개발이 됩니다.