2023. 1. 9. 15:05ㆍProgramming/Android
#잡설
m1 칩셋이 출시된지도 어언 1년이 지났지만 아직까지 호환성 관련된 이슈들이 가끔씩 튀어나올대마다 한숨이 나올때가 있다. 대부분의 툴들은 시간이 지났기때문인지 재설치하면 크게 문제되는 경우도 많지만, Android NDK라면 얘기가 또 다르다. 특히 이런류의 문제는 NDK에 가서 직접 코드를 수정해놓고 한참을 멍때리다가 뭔가 문제가 생겼을 때, NDK를 지우고 재설치하면 문제가 다시 튀어나오기때문에 더욱 환장할 노릇이다. 아무튼 오늘은 m1 mac에서 Android NDK를 처음 설치했을 때, 갑자기 arm64 아키텍쳐가 뭔지 모른다며 Unknown host CPU architecture: arm64
에러를 해결하는 방법에 대해 알아보자.
#원인
/Users/{Username}/Library/Android/sdk/ndk/{NdkVersion}/
위의 경로를 찾아가서 ndk-build
를 Vim같은 편집기로 열어보자. 그러면 아래와 같은 내용을 볼 수 있다.
#!/bin/sh
DIR="$(cd "$(dirname "$0")" && pwd)"
$DIR/build/ndk-build "$@"
대충 훑어보면 현재 디렉토리/build/ndk-build
에 인자값을 넘겨주고 실행하겠다는 얘기다. 오잉? 그렇다면 ndk-build
가 대체 뭐길래 Unknown host CPU architecture: arm64
라는 에러를 출력하는걸까? ./build/ndk-build
를 열어보면 다음과 같은 구문을 찾아볼 수 있다.
136 HOST_ARCH=$(uname -m)
137 case $HOST_ARCH in
138 i?86) HOST_ARCH=x86;;
139 x86_64|amd64) HOST_ARCH=x86_64;;
140 *) echo "ERROR: Unknown host CPU architecture: $HOST_ARCH"
141 exit 1
142 esac
143 log "HOST_ARCH=$HOST_ARCH"
144
그렇다. 이 스크립트는 빌드를 진행하는 HOST의 아키텍쳐를 보고 분기를 태워주는 녀석인데, 몹시 성가시게도 32bits x86 아키텍쳐와 64bits x86 아키텍쳐만 지원한다. m1 mac에서 uname -m
을 입력하면 arm64
라는 값이 출력되는 걸 볼 수 있는데, 이 스크립트는 arm64
아키텍쳐에 대한 처리가 되어있지 않으니까 Unknown host CPU architecture: arm64
라는 에러가 뜨는 것이다. 오오 통제라... 다행히 Rosetta2를 사용해서 이를 해결할 수 있다. arch x86_64 uname -m
을 입력해보면, 이전과는 달리 x86_64
라는 값이 출력되는 걸 볼 수 있다. 즉, build/ndk-build
를 실행하는 구문 앞에 단순히 arch x86_64
를 넣어주기만 하면, build/ndk-build
에서 uname -m
을 입력했을 때 arm64
대신 x86_64
가 출력되기 때문에 문제가 발생하지 않는다는 얘기다.
#해결ndk-build
를 다음과 같이 수정해주도록 하자.
#!/bin/sh
DIR="$(cd "$(dirname "$0")" && pwd)"
arch -x86_64 /bin/bash $DIR/build/ndk-build "$@"
이렇게 수정하면 build/ndk-build
를 실행할 때 uname -m
의 실행 결과가 arm64
가 아닌 x86_64
가 나오므로, 더 이상 Unknown host CPU architecture: arm64
라는 에러문이 출력되지 않는다.