Windows环境下使用ndk-build指令编译c/c++生成so库

3,855 阅读2分钟

小知识,大挑战!本文正在参与“  程序员必备小知识  ”创作活动

编译环境

  • android-ndk-r9b (这里使用老版本库为例 ,将该库目录下的ndk-build.cmd添加至系统环境变量中,方便后续操作,不同版本的ndk库ndk-build位置可能不太一样,这里你也可以使用最新库)

  • Windows10

编译步骤

  1. 第一步 创建工程文件夹, 这里以E盘下App目录为例
  2. 第二步 在App文件夹下创建子文件夹jni, 并将编写好的源代码以及Android.mk文件放入
  3. 打开命令窗口,执行编译命令
ndk-build.cmd  NDK_PROJECT_PATH=E:\App
  1. 等待编译 完成后会在jni同级目录下生成libs和obj两个文件夹,libs目录下存放的是编译好的so库,obj目录下存放的是.o链接库, 如果有需要,使用以下命令可以清除obj目录下文件:
ndk-build.cmd  clean

编译扩展配置

  1. 默认情况下编译只生成armeabi架构的so库,如果要生成x86以及其他cpu架构的so,需要在Android.mk文件所在目录下新建Application.mk文件,并加入以下配置:
APP_ABI := armeabi armeabi-v7a x86
或者编译所有架构
APP_ABI := all # 注意必须小写
  1. 默认情况下使用Andorid.mk作为编译脚本,如果想指定编译脚本文件可以添加APP_BUILD_SCRIPT参数进行指定:
ndk-build.cmd  NDK_PROJECT_PATH=E:\App APP_BUILD_SCRIPT=new_android.mk
  1. 默认情况下使用Andorid.mk同级目录下找Application.mk 如果想指定Application.mk文件路径,可以添加NDK_APPLICATION_MK进行指定:
ndk-build.cmd  NDK_PROJECT_PATH=E:\App NDK_APPLICATION_MK=new_application.mk

注意事项

  1. 编译时默认找jni目录下源码进行编译,所以需要在工程目录下新建jni子目录,原因在此

  2. android工程在引用so库时,必须放在对应架构目录下,否则打包apk时会忽略该文件的打包, 比如指定jni目录为libs ,引用的so是x86架构的,那么必须在libs目录下再新建一个名为x86的文件夹,然后将so放进去, 否则so库不打包

附加

ndk编译脚本文件Android.mk配置:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := key #so库引用名称  编译时会自动添加lib前缀,最后的结果为libkey.so
LOCAL_SRC_FILES := Test.cpp # 需要编译的源码

include $(BUILD_SHARED_LIBRARY)