Xamarin.Android에서 NDK 사용

JXUG Conference 오사카에서 발표한 Xamarin.Android+NDK의 데모 부분의 해설 기사입니다.

슬라이드는 이쪽.
"Xamarin.Android에서 네이티브 코드와 잘 어울리는 방법"
h tp // w w. s에서 멋지다. 네 t / 히든 xv / ㄱ 마리 난 d 로이 dn dk

Xamarin.Android에서 C/C++ 작성한 네이티브 코드를 프로젝트에 포함시켜 이용하기 위한 간단한 단계를 설명합니다.
전제는, Xamarin, Android SDK, Android NDK 환경이 갖추어져 있는 것.
Mac+Xamarin Studio에서 해설하고 있기 때문에, 다른 환경의 경우는 적절하게 읽어 주시면과.

아젠다는 이쪽.
1. NDK 빌드 환경 설정
2. 빌드하여 만든 libs 폴더 아래를 프로젝트에 추가
3. C#에서 호출
4. 빌드 타겟 추가

1. NDK 빌드 환경 설정



먼저 Android 앱 프로젝트를 만듭니다.
그리고 ndk-build에서 보면 일반 Android 앱 프로젝트로 보이도록 프로젝트 폴더 아래의 구성을 정돈합니다.

하나. 프로젝트에 project.properties 파일을 추가.

project.properties
target=android-19

두 번째로 프로젝트에 jni 폴더를 만들고 mk 파일과 소스를 추가합니다.

Android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := NativeTest
LOCAL_SRC_FILES := Native.cpp

include $(BUILD_SHARED_LIBRARY)

Application.mk
APP_ABI := all

Native.cpp
extern "C"
{
    int add( int a, int b );
}

int add( int a, int b )
{
    return a + b;
}


여기까지 할 수 있으면, 터미널을 열어 빌드해 봅니다.
프로젝트 폴더로 이동하여 ndk-build를 실행합니다. 아래와 같은 메시지가 표시되면 성공입니다.
Compile++ thumb  : NativeTest <= Native.cpp
SharedLibrary  : libNativeTest.so
Install        : libNativeTest.so => libs/armeabi/libNativeTest.so
Compile++ thumb  : NativeTest <= Native.cpp
SharedLibrary  : libNativeTest.so
Install        : libNativeTest.so => libs/armeabi-v7a/libNativeTest.so
Compile++ mips   : NativeTest <= Native.cpp
SharedLibrary  : libNativeTest.so
Install        : libNativeTest.so => libs/mips/libNativeTest.so
Compile++ x86    : NativeTest <= Native.cpp
SharedLibrary  : libNativeTest.so
Install        : libNativeTest.so => libs/x86/libNativeTest.so

2. 빌드하여 만든 libs 폴더 아래를 프로젝트에 추가



NDK 빌드에 성공하면 프로젝트 폴더 아래에 libs 폴더가 만들어져 있어야 합니다.
libs 폴더에는 각 플랫폼에 대한 라이브러리 파일이 있으므로 필요한만큼 프로젝트에 추가하고 빌드 작업을 'AndroidNativeLibrary'로 설정합니다.


3. C#에서 호출



이 네이티브 바이너리를 C# 코드에서 호출하려면 C#에서 Windows 앱을 작성한 적이 있는 사람들에게 친숙한 DllImport 속성을 사용합니다.

이번에는 템플릿으로 생성된 MainActivity에 추가해 보겠습니다.

MainActivity.cs
[DllImport("NativeTest")]
public static extern int add(int a, int b);

그대로 버튼 터치시의 처리를 재기록하여 네이티브 코드 실행의 확인을 할 수 있도록 합니다.

MainActivity.cs
button.Click += delegate
{
    var rand = new Random();
    var a = rand.Next(100);
    var b = rand.Next(100);
    button.Text = String.Format("{0} + {1} = {2}", a, b, add(a, b));
};

실행하면 이렇게. 무사히 콜되고 있는 것을 확인할 수 있습니다.


4. 빌드 타겟 추가



여기까지 네이티브 코드의 빌드에는 터미널로부터 ndk-build를 실행하고 있었습니다만, 이것으로는 불편.
그래서 프로젝트 파일(csproj)에 아래와 같은 <Target> 태그를 추가합니다.

*.csproj
<Project>
  <Target Name="BeforeBuild">
    <Exec Command="$(AndroidNdkDirectory)/ndk-build" />
  </Target>
</Project>

(주신 코멘트에 따라 추가 수정했습니다)
여기까지 네이티브 코드의 빌드에는 터미널로부터 ndk-build를 실행하고 있었습니다만, 이것으로는 불편.
그래서 프로젝트 설정의 커스텀 커멘드라고 하는 기능을 사용해, 프로젝트 빌드시에 NDK 빌드도 실행할 수 있도록 설정합니다.

여기서 1점 문제. . .
이 예에서는 커스텀 커멘드에 ndk-build의 풀 패스를 기재하고 있습니다만, 팀 개발 등에는 불편하네요. 환경 설정에서 값을 읽는 방법이라든지 아시는 분이라면 코멘트 등 주시면 감사합니다.

요약



이제 Xamarin.Android 프로젝트에서 NDK 네이티브 코드를 포함하여 빌드하고 실행하는 환경을 마련했습니다.
프로젝트 내에 일원 관리하는 것으로, 빌드·디버그의 템포가 좋아지는, 리포지토리를 분산시키지 않아도 되는 등의 메리트가 탄생할까.

좋은 웹페이지 즐겨찾기