You need to enable JavaScript to run this app. 如何在Android Studio中构建LAPACK以支持JNI正常调用其C函数
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android Studio中构建LAPACK以支持JNI正常调用其C函数

问题根因梳理
  • print_matrix_colmajor 并非LAPACK核心API,是LAPACKE自带示例的辅助打印函数,定义在lapacke_example_aux.c文件中,你之前在编译源里注释掉了这个文件,直接导致符号未定义
  • 当前CMake配置逻辑混乱:同时导入了非Android适配的预编译blas/lapack静态库,又通过add_subdirectory拉取LAPACK源码编译,两套库的依赖逻辑冲突,极易出现链接顺序错误、符号找不到、重复定义的问题
  • 核心遗漏:LAPACK的核心源码由Fortran编写,当前配置没有启用NDK的Fortran编译支持,就算编译过程不报错,链接阶段也会出现大量Fortran符号的未定义引用
  • 手动堆砌的include目录没有对应到LAPACK实际的头文件生成路径,编译器找不到头文件会进一步报错
正确的CMakeLists实现方案

推荐直接从源码编译适配Android NDK的LAPACK,避免第三方预编译库的ABI不兼容问题,完整配置可参照如下:

# 升级CMake版本要求,适配新版LAPACK的编译逻辑
cmake_minimum_required(VERSION 3.22.1)
# 必须加入Fortran语言支持,否则无法编译LAPACK的Fortran核心
project(LapackTest C CXX Fortran)

# 配置LAPACK编译参数,跳过无用模块加快编译速度
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE) # 编译静态库,匹配NDK静态链接规则
set(LAPACK_BUILD_TESTS OFF CACHE BOOL "" FORCE) # 跳过测试模块,无需要求
set(LAPACK_ENABLE_CBLAS ON CACHE BOOL "" FORCE) # 启用CBLAS的C语言接口
set(LAPACK_ENABLE_LAPACKE ON CACHE BOOL "" FORCE) # 启用LAPACKE的C语言接口
set(LAPACK_WITH_HEADERS ON CACHE BOOL "" FORCE) # 自动安装头文件到编译路径
set(LAPACK_INSTALL_BLA_STATIC ON CACHE BOOL "" FORCE)
set(LAPACK_INSTALL_LAPACK_STATIC ON CACHE BOOL "" FORCE)

# 引入LAPACK源码目录,替换为你实际存放LAPACK源码的相对路径
add_subdirectory(lapack)

# 编译你的本地native库
add_library( native-lib
        SHARED
        native-lib.c
        # 如果你需要调用print_matrix_colmajor,必须把这个辅助源文件加入编译
        lapack/LAPACKE/example/lapacke_example_aux.c
)

# 链接依赖,注意静态库的顺序:上层接口在前,底层依赖在后
target_link_libraries(native-lib
        # LAPACK的C接口库
        liblapacke
        # 核心LAPACK计算库
        liblapack
        # 底层BLAS基础计算库
        libblas
        # 链接Android系统日志库,方便调试
        log
)
常见避坑说明
  • 若坚持使用预编译的libblas.a/liblapack.a,必须确保这些库是针对你APP支持的ABI(如arm64-v8a、armeabi-v7a)编译的,不能直接使用PC端x86平台生成的静态库;需要按ABI拆分库存放路径,例如libs/${ANDROID_ABI}/libblas.a,链接时不要和源码编译的LAPACK模块混用
  • 确保你使用的Android NDK版本≥r25,该版本自带gfortran编译器,可直接编译Fortran源码;低版本NDK需要额外配置Fortran工具链才能完成LAPACK编译
  • print_matrix_colmajor属于示例辅助代码,不是生产可用的LAPACK标准API,验证功能时可直接调用LAPACK_dgemm这类核心C接口函数做测试,无需额外链接示例辅助文件
  • 不要手写重复的include目录,add_subdirectory(lapack)后LAPACK的CMake配置会自动把所有需要的头文件路径加入编译环境,手动堆砌的路径反而容易出现头文件版本冲突

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 20:27:02