news 2026/9/11 5:45:02

从零开始:在 Windows 上使用命令行编译 Android .so 动态库(NDK + CMake + Ninja)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零开始:在 Windows 上使用命令行编译 Android .so 动态库(NDK + CMake + Ninja)

🛠️ 从零开始:在 Windows 上使用命令行编译 Android .so 动态库(NDK + CMake + Ninja)

无需 Android Studio 构建系统,纯命令行搞定 Native 库编译

本文将手把手教你如何在 Windows + Git Bash 环境下,仅用命令行工具,基于 Android NDK、CMake 和 Ninja,编译出适用于 Android 的 .so 动态库。整个过程不依赖 Android Studio 的构建流程,适合集成到 CI/CD 或自定义构建脚本中。

✅ 前提条件

你已安装:

· Android SDK(包含 NDK 和 CMake)
· Git for Windows(提供 Git Bash 环境)

💡 如果你通过 Android Studio 安装了 SDK,默认路径通常为:

C:\Users\<用户名>\AppData\Local\Android\Sdk

本文假设你的路径为:D:\AndroidSDK


🔧 第一步:确认你的工具路径

根据你的环境,确认以下两个关键组件的位置:

组件 路径示例
NDK D:\AndroidSDK\ndk\26.3.11579264
CMake D:\AndroidSDK\cmake\3.22.1

⚠️ 注意:NDK 版本建议 ≥ r21,CMake ≥ 3.18(Android 官方推荐)


📦 第二步:下载 Ninja(构建工具)

Android NDK 推荐使用 Ninja 作为构建后端(比 Make 更快、更可靠)。

  1. 访问 https://github.com/ninja-build/ninja/releases
  2. 下载 ninja-win.zip
  3. 解压得到 ninja.exe
  4. 将其放在项目目录下,例如:
D:\ndkTest\ninja-win\ninja.exe

✅ Ninja 是单文件可执行程序,无需安装,无依赖。


📄 第三步:创建最小项目源码

在项目目录 D:\ndkTest 中创建两个文件:

  1. native-lib.c
#include<jni.h>JNIEXPORT jstring JNICALLJava_com_example_myapp_MainActivity_stringFromJNI(JNIEnv*env,jobject thiz){return(*env)->NewStringUTF(env,"Hello from C!");}
  1. CMakeLists.txt
cmake_minimum_required(VERSION 3.18.1) project("native-lib") add_library(native-lib SHARED native-lib.c) find_library(log-lib log) target_link_libraries(native-lib ${log-lib})

🖥️ 第四步:编写构建脚本 build.sh

在 D:\ndkTest 下创建 build.sh(使用 Git Bash):

#!/bin/bash# === 配置路径 ===NDK_PATH="/d/AndroidSDK/ndk/26.3.11579264"CMAKE_BIN="/d/AndroidSDK/cmake/3.22.1/bin/cmake"NINJA_BIN="/d/ndkTest/ninja-win/ninja.exe"# === 构建参数 ===ABI="arm64-v8a"# 可选: armeabi-v7a, x86, x86_64API_LEVEL=21BUILD_DIR="build"OUTPUT_DIR="libs"# === 检查工具 ===[-f"$CMAKE_BIN"]||{echo"❌ CMake not found";exit1;}[-f"$NINJA_BIN"]||{echo"❌ Ninja not found";exit1;}# === 清理并配置 ===rm-rf"$BUILD_DIR""$CMAKE_BIN"\-G"Ninja"\-DCMAKE_MAKE_PROGRAM="$NINJA_BIN"\-DCMAKE_TOOLCHAIN_FILE="$NDK_PATH/build/cmake/android.toolchain.cmake"\-DANDROID_ABI="$ABI"\-DANDROID_PLATFORM="android-$API_LEVEL"\-DCMAKE_BUILD_TYPE=Release\-B"$BUILD_DIR"\-S.# === 编译与输出 ===cd"$BUILD_DIR""$CMAKE_BIN"--build.--parallelcd..mkdir-p"$OUTPUT_DIR/$ABI"cp"$BUILD_DIR/libnative-lib.so""$OUTPUT_DIR/$ABI/"echo"✅ 输出:$OUTPUT_DIR/$ABI/libnative-lib.so"

▶ 第五步:运行构建

在 Git Bash 中执行:

cd/d/ndkTestchmod+x build.sh# 赋予执行权限(可选)./build.sh

成功后,你会在以下路径看到生成的动态库:

libs/arm64-v8a/libnative-lib.so

🔍 验证结果

  1. 检查架构
filelibs/arm64-v8a/libnative-lib.so# 应显示: ELF 64-bit LSB shared object, ARM aarch64
  1. 查看符号(可选)
/d/AndroidSDK/ndk/26.3.11579264/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-android-readelf-Wslibs/arm64-v8a/libnative-lib.so

🌟 优势总结

✅ 完全脱离 Android Studio 构建系统
✅ 支持多 ABI 快速切换
✅ 构建速度快(Ninja)
✅ 可集成到自动化脚本或 CI 流程


📌 常见问题

Q:为什么不用 make?
A:Git Bash 的 make 在某些精简版中缺失,而 Ninja 单文件、无依赖、官方推荐。

Q:如何支持 C++?
A:将源文件改为 .cpp,CMake 中会自动识别;如需手动指定,用 add_library(… your.cpp) 即可。

Q:如何打包成 AAR?
A:可配合 jar 命令将 jniLibs 打包,或使用 android.jar 工具链(进阶话题)。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 14:21:45

OCR结果后处理:提升CRNN输出质量的NLP技巧

OCR结果后处理&#xff1a;提升CRNN输出质量的NLP技巧 &#x1f4d6; 技术背景与问题提出 光学字符识别&#xff08;OCR&#xff09;作为连接图像与文本信息的关键技术&#xff0c;广泛应用于文档数字化、票据识别、智能客服等场景。尽管深度学习模型如CRNN在端到端文字识别中取…

作者头像 李华
网站建设 2026/9/4 16:25:21

三大图像转视频模型PK:推理速度与GPU利用率实测

三大图像转视频模型PK&#xff1a;推理速度与GPU利用率实测 引言&#xff1a;为何需要性能对比&#xff1f; 随着AIGC技术的爆发式发展&#xff0c;图像转视频&#xff08;Image-to-Video, I2V&#xff09; 已成为内容创作、影视特效和数字人领域的重要工具。然而&#xff0c…

作者头像 李华
网站建设 2026/9/3 5:48:16

VIT能否取代CRNN?视觉Transformer局限性分析

VIT能否取代CRNN&#xff1f;视觉Transformer局限性分析 &#x1f4d6; OCR文字识别的技术演进与现实挑战 光学字符识别&#xff08;OCR&#xff09;作为连接物理世界与数字信息的关键桥梁&#xff0c;已广泛应用于文档数字化、票据处理、车牌识别、工业质检等多个领域。随着深…

作者头像 李华
网站建设 2026/9/8 15:45:37

《哈利波鱼:霍格沃茨的东方秘仪》

哈利波鱼&#xff1a;霍格沃茨的东方秘仪 第一章 坩埚旁的鱼影 霍格沃茨的礼堂第一次出现整条清蒸鲈鱼时&#xff0c;差点没头的尼克足足愣了三秒。 “梅林的胡子啊&#xff0c;”他飘到赫敏身边&#xff0c;“格兰杰小姐&#xff0c;这是……某种黑魔法仪式吗&#xff1f;” 赫…

作者头像 李华
网站建设 2026/9/3 1:32:47

《 三鱼 》

鱼头纪事&#xff1a;餐桌上的黑暗森林人类用三百年才明白黑暗森林法则&#xff0c; 却用三千年也没学会鱼头该对向何方。 当三体舰队抵达太阳系时&#xff0c; 迎接他们的第一场地球宴会&#xff0c; 将决定两个文明的生死。第一幕&#xff1a;威慑纪元元年北京全聚德 公元221…

作者头像 李华
网站建设 2026/9/10 18:12:14

智能合同处理:CRNN OCR在法律行业的应用实践

智能合同处理&#xff1a;CRNN OCR在法律行业的应用实践 &#x1f4c4; 背景与挑战&#xff1a;法律文档数字化的瓶颈 在法律行业中&#xff0c;合同、诉状、判决书等大量非结构化文本构成了核心业务资产。传统的人工录入方式不仅效率低下&#xff0c;且极易因字迹模糊、排版复…

作者头像 李华