You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android NDK:64位设备编译arm64-v8a架构时出现构建错误

解决64位Android设备编译VirtualApp时的syscall未定义错误

你遇到的编译错误核心是64位ARM(arm64-v8a)架构下的Linux系统调用号宏未被正确定义,再加上旧版NDK的一些废弃配置警告,咱们一步步来修复:

一、修复系统调用号未定义问题

在IOUniformer.cpp中出现的__NR_chmod、__NR_fstatat64等宏,是Linux系统调用的编号——32位和64位ARM架构的编号完全不同,而且旧版NDK(r17)在64位环境下没有自动引入对应的定义头文件。你可以用两种方式解决:

方案1:引入正确的系统调用头文件

在IOUniformer.cpp的最开头添加以下头文件:

#include <sys/syscall.h>
#include <asm/unistd.h>

asm/unistd.h是arm64架构下系统调用号的定义文件,引入后应该能自动识别这些宏。

方案2:手动定义64位系统调用号

如果引入头文件后仍报错,可以手动针对arm64架构定义所需的系统调用号(这些编号是arm64标准的系统调用号):

// 在IOUniformer.cpp中使用这些宏的代码之前添加
#if defined(__aarch64__)
#define __NR_chmod 90
#define __NR_fstatat64 79
#define __NR_fstat64 80
// 后续如果还有其他未定义的__NR_xxx,也可以查arm64系统调用表补充
#endif

二、修复NDK配置警告和兼容性问题

1. 替换废弃的STL库

你的Application.mk中使用了gnustl_static,这个库在NDK r17已经被废弃,官方建议替换为c++_static(静态库更适合打包成单个so):

# 修改Application.mk中的APP_STL配置
APP_STL := c++_static

2. 修正NDK_MODULE_PATH的路径错误

错误日志里的WARNING: Ignoring unknown import directory是因为NDK_MODULE_PATH前面多了一个多余的冒号,修改Application.mk:

# 原来的写法会导致空路径前缀,改成下面的形式
NDK_MODULE_PATH := $(VA_ROOT)
# 如果需要添加其他模块路径,写成:NDK_MODULE_PATH := $(NDK_MODULE_PATH) $(VA_ROOT)

3. (可选)升级NDK版本

你当前使用的NDK r17版本较老,对64位架构的支持不如新版完善。建议升级到NDK r21及以上的LTS版本,同时可以同步升级compileSdkVersion和buildToolsVersion到更匹配的版本(比如compileSdkVersion 30+),能减少很多兼容性问题。

三、验证修复效果

  1. 执行Build -> Clean Project清理旧的编译缓存
  2. 重新编译项目,64位架构的编译错误应该会消失

内容的提问来源于stack exchange,提问作者code4rox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:18:08