Nomad Engineer

안드로이드 기존 프로젝트에 c++ 코드를 사용하는 방법 본문

개발/안드로이드

안드로이드 기존 프로젝트에 c++ 코드를 사용하는 방법

universehan 2021. 1. 30. 16:27

필요한 것

  • NDK 및 CMake 설치
  • ExternalNativeBuild Gradle 플러그인 설정하기
  • CMakeLists.txt 파일 정의 하기
  • Java 코드에서 native 함수 정의 하기
  • 라이브러리 로드 하기
  • jni를 사용한 cpp 소스 파일 

NDK 및 CMake 설치

안드로이드 SDK Manager 에서 NDK와 CMake를 설치 한다.

SDK Manager에서 NDK와 CMake를 체크한다.

Gradle에 CMake 빌드 종속성 추가 하기

어플리케이션 모듈(기본적으로 app)에 속한 build.gradle 파일에 다음을 추가한다.

android {
   ...
  
  defaultConfig {
    externalNativeBuild { 
      cmake { 
        cppFlags "-std=c++17" 
      }
    }
  }

  ...
  // CMakeList.txt의 종송석을 추가해 준다.
  externalNativeBuild { 
    cmake { 
      path "CMakeLists.txt" version "3.10.2" 
    }
  }
}

CMakeLists.txt 만들기

{모듈루트}/src 아래 CMakeLists.txt 파일을 만든다. 그리고 다음 내용을 추가한다.

cmake_minimum_required(VERSION 3.4.1)

add_library(native-lib
  SHARED
  src/main/cpp/test.cpp)

find_library(log-lib 
  log)

target_link_libraries(native-lib 
  ${log-lib})

 

Java 클래스에 바인딩하기

Java 클래스는 다음 작업을 해주어야 한다.

  • 시스템 라이브러리 로드
  • 테이티브 함수 정의
  • 네이티브 함수 호출
package your.package.path

class MainActivity : AppCompatActivity() {
   // ...
   private external fun stringFromJNI(): String
   
   init {
     System.loadLibrary("native-lib")
   }
   
   
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val result = stringFromJNI()
    Log.i("Native Test", "Native string is $result")    
  }
  
  ...
}

Cpp 코드 작성하기

다음 순서로 cpp코드를 작성한다.

  • cpp 소스 파일 추가하기
  • 코드 내용 작성하기
#include <jni.h>
#include <string>

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

빌드하고 호출해 보기

이제 빌드하고 테스트 해보자.

 

다음 해볼 것

다음은 파이프라인에서 자동으로 ndk를 빌드 할 수 있게. 도커로 빌드 할 수 있는 환경을 만들어 보도록 하겠다.

References

반응형