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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:53:46