Android에서 Glib 사용하기(NDK)

안드로이드 2023. 9. 10. 11:51


 최근 안드로이드 태블릿을 사용하게 되면서 일상에 많은 변화를 체험하고 있습니다. 휴대폰에 비해 압도적으로 큰 화면 덕분에 장거리 이동시 유튜브 영상 시청을 하거나, 블루투스 키보드를 연결하여 노트북 대용으로 업무를 수행할 수 있고, 통신사 USIM칩을 삽입하면 장소에 구애받지 않고 어디서든 인터넷을 사용할 수 있어 Wi-Fi를 찾아다니며 인터넷 연결을 해야 했던 노트북에 비해 상당한 편리함을 느끼고 있습니다.

 최근에 영상 활용 프로그램을 개발하고 있어 노트북을 자주 들고 다니는데, 이참에 안드로이드 태블릿으로 업무를 수행하면 좀 더 편하게 다닐 수 있을 것이라 생각되어 안드로이드 앱으로 내가 필요한 기능을 구현해보기로 하였습니다.

 

 처음엔 안드로이드도 Linux 기반이어서 Linux PC에서 개발하였던 프로그램을 쉽게 설계할 수 있을 것이라 생각하고 덤볐는데 예상치 못한 난관을 (예상대로) 겪고 있습니다. NDK를 처음 사용하다보니 생각보다 공부할게 많고...

 

 언제나 그랬듯이 좌충우돌 하며 NDK에 대해 공부했던 내용들을 정리해보고자 합니다. Linux 환경에서 자주 사용되는 Glib를 Android NDK 환경에서 사용할 수 있도록 라이브러리를 컴파일 하는 방법에 대해 살펴보도록 하겠습니다.

 

※개발환경
운영체제: Ubuntu22.04(WSL2)
Android버전: API21
NDK버전: r25c

 

 

1. Android NDK 설치

 

 안드로이드 공식 사이트에서 NDK를 다운로드 받습니다. 다음으로 폴더 압축을 푼 다음 .bashrc에 NDK폴더 경로를 PATH 환경변수에 추가해줍니다.

NDK 다운로드  |  Android NDK  |  Android Developers

NDK 다운로드 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 개발 플랫폼에 맞는 NDK 패키지를 선택합니다. NDK 최신 버전의 변경사항 및 이전 버전에 관한 정

developer.android.com

 

export PATH=NDK경로:$PATH

 
 

2. 개발환경 구축

 

 Android NDK 개발환경 구축을 위해 필요한 패키지들을 설치합니다.

 

$ sudo apt install meson ninja openjdk-19-jdk 

 

3. Glib 사용을 위한 라이브러리 다운로드

 

Glib 라이브러리는 아래 사이트에서 다운로드 합니다. (glib-2.77.2 기준)
https://gitlab.gnome.org/GNOME/glib/-/releases/2.77.2

 

Glib 라이브러리를 사용하기 위해서는 아래의 패키지들이 먼저 준비되어 있어야 합니다.

 

Libiconv
http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.17.tar.gz

 

Gettext
http://ftp.gnu.org/pub/gnu/gettext/gettext-0.21.tar.gz

 

4. Configure 환경 구성 및 컴파일

 

 다운로드한 라이브러리를 Android 기기에서 동작할 수 있도록 컴파일 하기 위해 Configure 환경에 맞게 설정을 해주어야 합니다. 아래의 스크립트를 자신의 환경에 맞추어 작성합니다.

 

# env.sh

#컴파일된 패키지가 설치될 경로
export PREFIX=/home/user/Android
#라이브러리 경로
export LIBDIR=$PREFIX/lib
#include 경로
export INCLUDEDIR=$PREFIX/include
#pkg-config 경로
export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig
#Build가 진행되는 HOST기기 정보
export BUILD_SYS=x86_64-linux-gnu
#적용하고자 하는 최소 안드로이드 버전. 21부터 aarch64(ARMv8) 지원
export ANDROID_API=21
#NDK 내부에 위치한 sysroot 경로
export SYSROOT=NDK설치경로/toolchains/llvm/prebuilt/linux-x86_64/sysroot/
export TOOLCHAIN=NDK설치경로/toolchains/llvm/prebuilt/linux-x86_64/

#안드로이드 기기의 아키텍처
export TARGET=aarch64-linux-android     #ARMv8
#export TARGET=armv7a-linux-androideabi #ARMv7
#export TARGET=i686-linux-android       #32비트
#export TARGET=x86_64-linux-android     #64비트

export AR=$TOOLCHAIN/bin/llvm-ar
export CC=$TOOLCHAIN/bin/$TARGET$ANDROID_API-clang
export AS=$TOOLCHAIN/bin/llvm-as
export CXX=$TOOLCHAIN/bin/$TARGET$ANDROID_API-clang++
export LD=$TOOLCHAIN/bin/ld
export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
export STRIP=$TOOLCHAIN/bin/llvm-strip

export LD_LIBRARY_PATH=$LIBDIR
export CFLAGS="-fPIC -I$INCLUDEDIR"
export CXXFLAGS="-fPIC -I$INCLUDEDIR"
export LDFLAGS="-fPIC -pie -L$LD_LIBRARY_PATH"
export LIBS="-L$LD_LIBRARY_PATH"

export PKG_CONFIG=/usr/bin/pkg-config
export PKG_CONFIG_PATH=$LIBDIR/pkgconfig

 

 환경 구성 스크립트 작성이 완료되었다면 이제 본격적으로 라이브러리를 크로스컴파일 해보겠습니다. 먼저 libiconv 라이브러리를 크로스컴파일합니다.

 

. ./env.sh

cd libiconv-1.17/
./configure --host=$TARGET \
	--prefix=$PREFIX \
	--enable-static

make -j8
make install

 

다음으로 Gettext 라이브러리를 크로스컴파일 합니다.

 

. ./env.sh

cd gettext-0.21/
./configure --host=$TARGET \
	--prefix=$PREFIX \
	--enable-static

make -j8
make install

 

5. Glib 크로스컴파일을 위한 meson 환경 구성 및 컴파일


Glib을 사용하기 위해 필요한 라이브러리 설치가 완료되었다면 Glib를 크로스컴파일 합니다. Glib는 meson 컴파일 환경을 제공하고 있어 아래와 같이 cross_file.txt 파일을 작성하여 적용하실 수 있습니다. 

[constants]
arch = 'aarch64-linux-android'
android_ndk = 'NDK 경로/toolchains/llvm/prebuilt/linux-x86_64/bin/'
outdir = '라이브러리 설치 경로/'

[binaries]
ar = 'NDK 경로/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar'
c = 'NDK 경로/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang'
as = 'NDK 경로/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar'
cpp = 'NDK 경로/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang++'
ranlib = 'NDK 경로/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ranlib'
strip = 'NDK 경로/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip'
ld = 'NDK 경로/toolchains/llvm/prebuilt/linux-x86_64/bin/ld'
objcopy = 'NDK 경로/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-objcopy'
pkgconfig = '/usr/bin/pkg-config'

[properties]
sys_root = 'NDK 경로/toolchains/llvm/prebuilt/linux-x86_64/sysroot'
pkg_config_lib_dir = '라이브러리 설치 경로/lib/pkgconfig'

[host_machine]
system = 'android'
cpu_family = 'aarch64'
cpu = 'aarch64'
endian = 'little'

[built-in options]
prefix = '라이브러리 설치 경로/'
c_args = ['-fPIC','-I/라이브러리 설치 경로/include']
cpp_args = ['-fPIC','-I/라이브러리 설치 경로/include']
c_link_args = ['-fPIE','-L/안드로이드 설치 경로/lib']

pkg_config_path = '/안드로이드 설치 경로/lib/pkgconfig'

default_library = 'static'

 
cross_file.txt 파일이 준비되었다면 컴파일 및 설치를 진행합니다.

# . ./env.sh
cd glib-2.77.2
meson build --cross-file cross_file.txt
cd build
ninja
ninja install

 

6. 안드로이드 프로젝트에 적용하기 

 
라이브러리 설치 경로에 Glib 라이브러리 파일이 만들어진 것을 확인하실 수 있습니다. 만들어진 Glib 라이브러리 파일을 자신의 NDK 프로젝트에 삽입하시면 안드로이드 앱으로 Glib를 실행할 수 있습니다.

 

참고자료

GitHub - edaplayer/android-ndk-harfbuzz

Contribute to edaplayer/android-ndk-harfbuzz development by creating an account on GitHub.

github.com

 

Cross-compile GLib for Android — MobileInsight Official Website

First get the source code for gettext 0.18.3 $ wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.18.3.tar.gz $ tar zxvf gettext-0.18.3.tar.gz To compile gettext-0.18.3, a patch must be applied. In gettext-tools/src/msginit.c, change line 1088 from fullname

mobileinsight.net

 

Cross-compile GLib for Android · Nosce Te Ipsum

Cross-compile GLib for Android 17 Jul 2016 Prepare cross-compile environment Update: You may now use Android NDK r15c and beyond. I have made an all-in-one script repo at my GitHub repo First, you need to have Android NDK r10e installed, which can be downl

zwyuan.github.io

 

300x250