1. Android Studio -> Create New Project -> Native C++

2. app/build.gradle을 열어보면 아래와 같이 되어있다.

android {
    compileSdkVersion 29
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId "com.codetronik.myapplication"
        minSdkVersion 24
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
    }

arm64만 빌드하기 위해 externalNativeBuild { } 밑줄에 ndk { }를 추가한다. (수정하지 않으면 x86, x86_64, armeabi까지 모두 빌드됨)

        ndk {
            abiFilters 'arm64-v8a'
        }

만약 armeabi-v7a도 추가한다면 nox에서 64비트 모듈을 무시하고 32비트 모듈을 호출하게 되니 주의

3. nox 64비트 다운로드 (32비트를 받으면 arm64-v8a 에뮬레이션이 불가능)

4. 옵션에서 ROOT권한 주고, 개발자 옵션에서 USB 디버깅 허용 (구글에서 "nox 안드로이드 분석 환경" 로 검색해보면 가이드 많이 나옴)

5. 안드로이드 스튜디오에서 nox 기기를 apk 실행용으로 설정한다.

6. 아래와 같이 arm64-v8a 환경에서 잘 동작하는지 확인한다.

1) 아래는 arm64-v8a 전용 어셈블리어이므로, 타 cpu환경에서는 동작하지 않는다.

extern "C" JNIEXPORT jstring JNICALL
Java_com_codetronik_myapplication5_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";

__asm__ (".byte 0x03\n"\
        ".byte 0x00\n"\
        ".byte 0x00\n"\
        ".byte 0x14\n"\
        ".byte 0xde\n"\
        ".byte 0xad\n"\
        ".byte 0xbe\n"\
        ".byte 0xef\n"\
        ".byte 0xde\n"\
        ".byte 0xad\n"\
        ".byte 0xbe\n"\
        ".byte 0xef\n");

    return env->NewStringUTF(hello.c_str());
}

2) nox-adb을 root로 실행 후 빌드한 jni가 arm64로 동작 중인지 확인한다.

+ Recent posts