ARM64-v8a架构下Android Studio调用汇编函数问题求助
针对ARM64-v8a Android应用集成汇编函数的解决方案
我之前也踩过在Android Studio里给ARM64-v8a应用集成汇编函数的坑,结合你给出的CMakeLists.txt片段,给你梳理几个关键的调整点和完整的解决方案:
1. 修正CMakeLists.txt配置
首先要明确锁定ARM64-v8a架构编译,同时完善汇编文件的编译规则,以下是调整后的完整配置:
cmake_minimum_required(VERSION 3.4.1) # 锁定仅针对ARM64-v8a架构编译,避免其他架构干扰 set(CMAKE_SYSTEM_PROCESSOR aarch64) set(ANDROID_ABI arm64-v8a) # 启用汇编语言支持 enable_language(ASM) set(can_use_assembler TRUE) set(CMAKE_VERBOSE_MAKEFILE on) # 如果你的汇编代码需要预处理(比如用到#define宏),保留这个编译选项;不需要的话可以删除 set_source_files_properties(multiple.s PROPERTIES COMPILE_FLAGS "-x assembler-with-cpp") # 构建Native库,务必把汇编文件加入源文件列表 add_library( # 替换成你的库名称,比如native-lib native-lib # 选择编译为共享库(SHARED)或静态库(STATIC) SHARED # 你的C/C++源文件(如果有的话) native-lib.cpp # 你的汇编文件 multiple.s ) # 链接Android日志库(可选,根据你的需求添加) find_library( log-lib log ) target_link_libraries( native-lib ${log-lib} )
2. 汇编代码(multiple.s)的ARM64-v8a语法规范
ARM64的汇编语法和32位ARM差异很大,要注意这些细节:
- 必须显式导出函数,用
.global和.type声明:.global multiply .type multiply, %function multiply: // ARM64示例逻辑:两个整数相乘,返回结果 mul x0, x0, x1 // 前两个参数存在x0、x1,结果存回x0(符合ARM64调用约定) ret - 遵循ARM64调用约定:前8个参数用
x0-x7传递,返回值存在x0中 - 不要给函数名加下划线前缀(这是x86架构的要求,ARM64在Android中不需要)
3. 从Java/Kotlin调用汇编函数
在JNI接口类中声明对应的native方法即可,比如Kotlin版本:
class NativeLib { companion object { init { System.loadLibrary("native-lib") // 加载你在CMake中定义的库名 } } // 声明native方法,名称要和汇编函数完全一致 external fun multiply(a: Long, b: Long): Long }
Java版本:
public class NativeLib { static { System.loadLibrary("native-lib"); } public native long multiply(long a, long b); }
4. 常见问题排查
- 如果编译报
undefined reference to <函数名>:检查汇编文件里的函数名是否和JNI声明一致,有没有添加.global和.type声明 - 如果汇编编译失败:检查指令是否符合ARM64规范(比如不能用32位的
mov r0, r1,要改用mov x0, x1) - 确保Module的build.gradle中指定了ABI过滤:
android { defaultConfig { ndk { abiFilters 'arm64-v8a' } } }
我之前用这套配置成功在ARM64-v8a设备上跑通了汇编函数调用,你可以照着调整试试,有具体的编译错误信息的话还能进一步细化排查。
内容的提问来源于stack exchange,提问作者Boooooooooms
相关产品推荐
相关产品推荐

