未知主机 CPU 架构:arm64,Android NDK SiliconM1 Apple MacBook Pro

Unknown host CPU architecture: arm64 , Android NDK SiliconM1 Apple MacBook Pro

我有一个项目在 windows os 中运行良好,但是当我切换笔记本电脑并在 MacBook Pro M1[=48= 中打开一个现有项目时].我无法在 MacBook pro M1 中 运行 现有的 android 项目。首先我得到

Execution failed for task ':app:kaptDevDebugKotlin'. > A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution > java.lang.reflect.InvocationTargetException (no error message)

此错误是由于 Room 数据库造成的 我应用了一个修复程序,该修复程序在 Room 数据库之前添加了库下方,并且 将我的 JDK 位置从文件结构从 JRE 更改为 JDK.

kapt "org.xerial:sqlite-jdbc:3.34.0"

   //Room components
    kapt "org.xerial:sqlite-jdbc:3.34.0"
    implementation "androidx.room:room-ktx:$rootProject.roomVersion"
    kapt "androidx.room:room-compiler:$rootProject.roomVersion"
    androidTestImplementation "androidx.room:room-testing:$rootProject.roomVersion"

在那之后我遇到了一个问题 Unknown host CPU architecture: arm64

我的项目中有一个 SDK 正在使用下面这行。

android {
    externalNativeBuild {
        ndkBuild {
           path 'Android.mk'
        }
    }
    ndkVersion '21.4.7075529'


}

应用Gradle

 externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.18.1"
            //version "3.10.2"
        }
    }

[CXX1405] error when building with ndkBuild using /Users/mac/Desktop/Consumer-Android/ime/dictionaries/jnidictionaryv2/Android.mk: Build command failed. Error while executing process /Users/mac/Library/Android/sdk/ndk/21.4.7075529/ndk-build with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=/Users/mac/Desktop/Consumer-Android/ime/dictionaries/jnidictionaryv2/Android.mk APP_ABI=arm64-v8a NDK_ALL_ABIS=arm64-v8a NDK_DEBUG=1 APP_PLATFORM=android-21 NDK_OUT=/Users/mac/Desktop/Consumer-Android/ime/dictionaries/jnidictionaryv2/build/intermediates/cxx/Debug/4k4s2lc6/obj NDK_LIBS_OUT=/Users/mac/Desktop/Consumer-Android/ime/dictionaries/jnidictionaryv2/build/intermediates/cxx/Debug/4k4s2lc6/lib APP_SHORT_COMMANDS=false LOCAL_SHORT_COMMANDS=false -B -n} ERROR: Unknown host CPU architecture: arm64

这是导致此问题的原因,每当我对此行发表评论时

path 'Android.mk'

它开始工作正常,有什么方法可以帮助我 运行 这个项目使用这段代码而不遇到这个 NDK 问题?

更新 - Room 似乎在最近的更新中得到了修复,因此您可以考虑将 Room 更新到最新版本 (2.3.0-alpha01 / 2.4.0-alpha03 或以上)

使用 ndkVersion "24.0.8215888" 将 ndk 更新到此版本,无需编辑任何脚本:)

GitHub Issue Tracker

为了在 Apple Silicon M1 上解决这个问题,我找到了三个选项

一个

使用 NDK 24

android {
    ndkVersion "24.0.8215888"
    ...
}

您可以使用

安装它
echo "y" | sudo ${ANDROID_HOME}/tools/bin/sdkmanager --install 'ndk;24.0.8215888'

echo "y" | sudo ${ANDROID_HOME}/sdk/cmdline-tools/latest/bin/sdkmanager --install 'ndk;24.0.8215888'

取决于 sdkmanager 所在的位置

B

更改 ndk-build 以使用 Rosetta x86。用

搜索你安装的 ndk
find ~ -name ndk-build 2>/dev/null

例如

vi ~/Library/Android/sdk/ndk/22.1.7171670/ndk-build

并改变

DIR="$(cd "$(dirname "[=15=]")" && pwd)"
$DIR/build/ndk-build "$@"

DIR="$(cd "$(dirname "[=16=]")" && pwd)"
arch -x86_64 /bin/bash $DIR/build/ndk-build "$@"

C

将您的 ndk-build 转换为 cmake 版本

解决了这个问题。

Finder -> 转到文件夹(/Users/mac/Library/Android/sdk/ndk/21.4.7075529) -> 现在编辑 ndk-build 在文本编辑器中打开它并粘贴到代码脚本下方并重新 运行 您的项目。

来自

#!/bin/sh
DIR="$(cd "$(dirname "[=10=]")" && pwd)"
$DIR/build/ndk-build "$@"

#!/bin/sh
DIR="$(cd "$(dirname "[=11=]")" && pwd)"
arch -x86_64 /bin/bash $DIR/build/ndk-build "$@"

Reference Link

SDK 管理器的 Canary 通道中有一个新的 CMake 3.22.1 包,它具有对 macOS 的 M1 支持。

通过此版本以及最新的 platform-tools 和 build-tools 软件包,现在可以在 M1 Mac 没有 Rosetta(但有 beta/canary 包)。需要这些版本的组件:

Android Studio 2021.1.1
Android Gradle Plugin 7.1.0 (the plugin includes an aapt2 binary)
Android SDK Build-Tools 32.1-rc1 (SDK's stable channel)
Android SDK Platform Tools 32.0.0 (SDK's stable channel)
Android NDK 24.0.7956693 (beta 2, from the SDK's beta channel)
CMake 3.22.1 (SDK's canary channel)

Android Studio 可以简单配置为使用 Canary 通道来安装 CMake,然后切换回稳定通道,以避免更新其他所有内容。

需要在build.gradle配置NDK和CMake版本,例如:

android {
    ndkVersion "24.0.7956693-beta2"
    externalNativeBuild {
        cmake {
            path file('src/main/cpp/CMakeLists.txt')
            version '3.22.1'
        }
    }
}

在 NDK r24 beta 2 中,yasm 和 simpleperf 仍然是 x86_64-only。

在 non-Rosetta M1 Mac 上使用 ndk-build 需要更新的 NDK r24 构建,它修复了 makefile 以使用通用 Python3 二进制文件。 NDK r24 最终版本应该有这个修复。