Programming/안드로이드
안드로이드 NDK (Native Development Kit) r16b 설치
파란크리스마스
2019. 1. 26. 11:38
728x90
출처
- NDK 10 - Android Rebuilds
- Google Developers Korea Blog: Google Developers Korea Blog: 안드로이드 NDK (Native Development Kit) r14 를 소개합니다.
Python 설치
$ sudo apt install python
Android NDK(C/C++) 다운로드, 압축 해제
$ wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip $ sudo mv android-ndk-r16b-linux-x86_64.zip /opt/ $ cd /opt/ $ sudo unzip android-ndk-r16b-linux-x86_64.zip
NDK 경로 path에 추가
$ echo 'export ANDROID_NDK_ROOT=/opt/android-ndk-r16b' | tee -a ~/.bashrc $ echo 'export PATH=$PATH:$ANDROID_NDK_ROOT' | tee -a ~/.bashrc
.profile-ndk 파일 작성
$ vi ~/.profile_ndk
.profile-ndk 내용
export ANDROID_NDK_ROOT=/opt/android-ndk-r16b export NDK_TOOLCHAIN_VERSION=4.7 export TOOLCHAIN=/opt/android-14-toolchain export PATH=$TOOLCHAIN/bin:$PATH
.profile-ndk 실행 (NDK 빌드시 사용)
$ chmod a+x ~/.profile_ndk $ source ~/.profile_ndk
toolchain 설치
$ sudo $ANDROID_NDK_ROOT/build/tools/make-standalone-toolchain.sh \ --verbose \ --toolchain=arm-linux-androideabi-4.7 \ --install-dir=$TOOLCHAIN \ --platform=android-14 HOST_OS=linux HOST_EXE= HOST_ARCH=x86_64 HOST_TAG=linux-x86_64 HOST_NUM_CPUS=8 BUILD_NUM_CPUS=16 Auto-config: --arch=arm ## COMMAND: python /opt/android-ndk-r16b/build/tools/make_standalone_toolchain.py --arch arm --api 14 --stl gnustl --install-dir=/opt/android-14-toolchain Toolchain installed to /opt/android-14-toolchain.
toolchain 환경설정
$ echo 'export TOOLCHAIN=/opt/android-14-toolchain' | tee -a ~/.bashrc $ echo 'export PATH=$TOOLCHAIN/bin:$PATH' | tee -a ~/.bashrc $ echo 'export CC=arm-linux-androideabi-gcc' | tee -a ~/.bashrc
예제
Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY)
hello-jni.c
#include <string.h> #include <jni.h> JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz ) { #if defined(__arm__) #if defined(__ARM_ARCH_7A__) #if defined(__ARM_NEON__) #if defined(__ARM_PCS_VFP) #define ABI "armeabi-v7a/NEON (hard-float)" #else #define ABI "armeabi-v7a/NEON" #endif #else #if defined(__ARM_PCS_VFP) #define ABI "armeabi-v7a (hard-float)" #else #define ABI "armeabi-v7a" #endif #endif #else #define ABI "armeabi" #endif #elif defined(__i386__) #define ABI "x86" #elif defined(__x86_64__) #define ABI "x86_64" #elif defined(__mips64) /* mips64el-* toolchain defines __mips__ too */ #define ABI "mips64" #elif defined(__mips__) #define ABI "mips" #elif defined(__aarch64__) #define ABI "arm64-v8a" #else #define ABI "unknown" #endif return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI " ABI "."); }
컴파일
$ ndk-build NDK_PROJECT_PATH=`pwd` APP_BUILD_SCRIPT=Android.mk Android NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-14. [arm64-v8a] Compile : hello-jni <= hello-jni.c [arm64-v8a] SharedLibrary : libhello-jni.so [arm64-v8a] Install : libhello-jni.so => libs/arm64-v8a/libhello-jni.so [armeabi-v7a] Compile thumb : hello-jni <= hello-jni.c [armeabi-v7a] SharedLibrary : libhello-jni.so [armeabi-v7a] Install : libhello-jni.so => libs/armeabi-v7a/libhello-jni.so [x86] Compile : hello-jni <= hello-jni.c [x86] SharedLibrary : libhello-jni.so [x86] Install : libhello-jni.so => libs/x86/libhello-jni.so [x86_64] Compile : hello-jni <= hello-jni.c [x86_64] SharedLibrary : libhello-jni.so [x86_64] Install : libhello-jni.so => libs/x86_64/libhello-jni.so
Java 사용 예제
package com.example.hellojni; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class HelloJni extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_hello_jni); TextView tv = (TextView)findViewById(R.id.hello_textview); tv.setText( stringFromJNI() ); } public native String stringFromJNI(); public native String unimplementedStringFromJNI(); static { System.loadLibrary("hello-jni"); } }