Windows命令ndk-build编译.so文件

本文介绍如何使用 Android NDK 进行项目编译,包括配置环境变量、创建 jni 目录、编辑 Application.mk 和 Android.mk 文件,并通过批处理文件进行编译。文章详细展示了如何指定 ABI、平台版本、链接静态库等配置。

1. 下载一个NDK包,然后设置ndk-build所在的目录到环境变量。

2. 在源代码目录新建一个jni目录(试了几次Android.mk如果不在jni目录时需要写完整路径)。

3. Application.mk

#APP_ABI := all
#APP_ABI := arm64-v8a armeabi-v7a armeabi x86 x86_64
APP_ABI := arm64-v8a armeabi-v7a
APP_PLATFORM := android-14
#APP_STL := stlport_shared
APP_STL := stlport_static
APP_MODULES := Common

4. Android.mk

LOCAL_PATH := $(call my-dir)


######################################################### sqlite3 #########################################################


include $(CLEAR_VARS)

LOCAL_MODULE := sqlite3

MY_INCLUDES := -I$(LOCAL_PATH)/../..

LOCAL_SRC_FILES := ../../Framework/Sqlite3/sqlite3.c

LOCAL_CFLAGS := -DPlatform_Linux $(MY_INCLUDES) -Wall -O3

LOCAL_EXPORT_C_INCLUDES :=
LOCAL_EXPORT_CFLAGS :=
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_STATIC_LIBRARY)


######################################################### cJSON #########################################################


include $(CLEAR_VARS)

LOCAL_MODULE := cJSON

MY_INCLUDES := -I$(LOCAL_PATH)/../..

LOCAL_SRC_FILES := ../../Framework/Json/cJSON.c

LOCAL_CFLAGS := -DPlatform_Linux $(MY_INCLUDES) -ldl -Wall -O3

LOCAL_EXPORT_C_INCLUDES :=
LOCAL_EXPORT_CFLAGS :=
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_STATIC_LIBRARY)


######################################################### Common #########################################################


include $(CLEAR_VARS)

LOCAL_MODULE := Common


MY_INCLUDES := -I$(LOCAL_PATH)/../.. \
			-I$(LOCAL_PATH)/../../Framework/Interface/HAL \
			-I$(LOCAL_PATH)/../Common_IAR_820

MY_SRC_FILES := $(wildcard $(LOCAL_PATH)/../Code/*.cpp) \
					$(wildcard $(LOCAL_PATH)/../../Framework/express/*.cpp) \
					$(wildcard $(LOCAL_PATH)/../../Framework/Util/*.cpp) \
					$(wildcard $(LOCAL_PATH)/../../Framework/fs/*.cpp) \
					$(LOCAL_PATH)/../../HAL/linkLayer/Frame.cpp

LOCAL_SRC_FILES := $(MY_SRC_FILES)

#LOCAL_SRC_FILES := ../Code/BinStream.cpp \
#					../Code/ColumnData.cpp \
#					../Code/Common.cpp \
#					../Code/DataGetter.cpp \
#					../Code/ItemNode.cpp \
#					../Code/MenuTreeNode.cpp \
#					../Code/PublicText.cpp \
#					../Code/Resources.cpp \
#					../Code/Section.cpp \
#					../../Framework/express/FX_Math.cpp \
#					../../Framework/express/FX_Express.cpp \
#					../../Framework/Util/StringUtil.cpp \
#					../../Framework/fs/FxFile.cpp
#					$(LOCAL_PATH)/../../HAL/linkLayer/Frame.cpp
					

LOCAL_CFLAGS := -DPlatform_Linux $(MY_INCLUDES) -ldl -Wall -O3 -std=c++11

# 连接静态库
LOCAL_STATIC_LIBRARIES := sqlite3 cJSON

# 连接动态库
#LOCAL_SHARED_LIBRARIES :=

LOCAL_EXPORT_C_INCLUDES :=
LOCAL_EXPORT_CFLAGS :=
LOCAL_EXPORT_LDLIBS := -llog
#include $(BUILD_SHARED_LIBRARY)
include $(BUILD_STATIC_LIBRARY)

5. 使用批处理(为了方便)

@echo off

chcp 936


rem -jn : 表示使用多少个CPU内核编译
rem V=1: 输出编译参数
rem -B : 强制重新编译
rem NDK_LIBS_OUT=.so输出目录
rem NDK_OUT=.a输出目录
ndk-build -j4 -B V=1 NDK_DEBUG=1 NDK_LIBS_OUT=../../Libs/Debug/Android/libs NDK_OUT=../../Libs/Debug/Android/obj

pause

NDK_LIBS_OUT: 生成的动态库所在目录

NDK_OUT: 生成的.o文件所在的目录




<think>首先,用户正在查询关于使用 ndk-build 编译 Android.mk 文件命令。 我需要基于所提供的引用信息构建答案。 引用内容讨论了 NDK 开发,特别是使用 ndk-build 和 Android.mk 文件进行编译。 关键点来自引用: - 引用[2]提到使用 ndk-build 编译,并指定了在 Android Studio 中配置 Android.mk 文件的路径。 - 引用[4]讨论了 Application.mk 的内容,但用户特别询问的是 ndk-build 和 Android.mk。 - 引用[5]强调了在 ndk-build 中模块名称一致性。 用户明确的问题:"请问使用 ndk-build 编译 android.mk 的命令" 所以,我需要提供用于运行 ndk-build命令,重点是编译 Android.mk 文件。 从引用中: - 引用[2]描述了在 Android Studio 中设置 ndk-build,但并不直接提供终端命令- 在一般 NDK 开发中,ndk-build 命令是从终端或命令行运行的,以编译 Android.mk 文件。 标准命令是: `ndk-build` 这假设 Android NDK 已安装且路径设置正确。 该命令通常在包含 Android.mk 文件的目录中运行。 来自引用[2]:它提到在 build.gradle 中配置 externalNativeBuild 用于 ndk-build,但用户可能想要直接命令行用法。 我需要确保回答帮助用户逐步操作。 回答结构: 1. **确认命令**:直接给出命令。 2. **前提条件**:确保 NDK 已安装并设置路径。 3. **运行命令的位置**:在包含 Android.mk 的目录中运行。 4. **验证**:如引用[5]所说,检查模块名称是否一致。 来自引用[1]:它讨论了使用 CMake,但用户询问的是 ndk-build,所以我应该聚焦于 ndk-build命令语法: 基本命令是 `ndk-build`。用户可以添加参数,但对于简单编译,只需运行 `ndk-build` 在正确目录。 在回答中: - 使用中文,因为系统指令指定了中文回答。 - 结构化清晰。 - 参考引用,在相关地方添加引用标识符。 生成相关问题:系统指令要求在回答末尾生成相关问题。 最终回答结构: 1. 介绍命令。 2. 解释如何运行。 3. 提示成功编译。 4. 相关问题。 命令: `ndk-build` 如引用[2]和[5]中所暗示。 为了清晰起见: 命令ndk-build 在包含 Android.mk 和可能的 Application.mk 的目录中运行。 </think>基于您查询的使用 `ndk-build` 编译 `Android.mk` 文件命令,我将结合提供的引用信息,逐步解释操作流程。`ndk-build` 是 Android NDK 提供的命令行工具,用于基于 `Android.mk` 文件构建原生代码库(如 `.so` 文件)。以下是详细步骤和命令: ### 1. **前提条件** - **安装 NDK**:确保 Android NDK 已下载并安装。Android Studio 会自动定义 `ANDROID_NDK` 路径变量(如引用[1]所述),您可以在终端中通过 `echo $ANDROID_NDK` 验证路径是否设置正确。 - **文件准备**:您的项目目录必须包含 `Android.mk` 文件(定义模块和源文件)和可选的 `Application.mk` 文件(配置 ABI、标准库等,如引用[4]所述)。 - **路径确认**:确保 `ndk-build` 脚本位于 NDK 安装目录的根路径下(例如 `$ANDROID_NDK/ndk-build`)。 ### 2. **编译命令** 核心命令是直接在终端运行 `ndk-build`,它默认使用当前目录下的 `Android.mk` 文件进行编译: ```bash ndk-build ``` - **命令详解**: -命令会自动查找当前目录中的 `Android.mk` 文件,并开始编译过程。 - 如果配置了 `Application.mk`(例如设置 `APP_ABI` 或 `APP_STL`),它会一并生效(如引用[4]所述)。 - 编译生成的库文件(如 `.so` 文件)默认输出到项目的 `obj` 和 `libs` 子目录中。 - **关键参数**: - **指定 NDK 路径**:如果 `ANDROID_NDK` 变量未设置,可以显式传递路径: ```bash $ANDROID_NDK/ndk-build ``` - **清理构建**:添加 `clean` 参数删除编译生成的文件: ```bash ndk-build clean ``` - **调试模式**:使用 `NDK_DEBUG=1` 生成带调试符号的库: ```bash ndk-build NDK_DEBUG=1 ``` ### 3. **运行步骤示例** 1. **打开终端**:切换到包含 `Android.mk` 的项目目录。例如: ```bash cd /path/to/your/project/src/main/jni ``` 这里,`src/main/jni` 是 Android Studio 项目中常见的 JNI 代码位置(如引用[2]所述)。 2. **执行编译命令**: ```bash ndk-build ``` - 如果成功,终端会显示构建日志,并在 `obj` 和 `libs` 目录生成库文件。 3. **验证输出**: - 检查生成的 `.so` 文件是否与 `Android.mk` 中定义的 `LOCAL_MODULE` 名称一致(如引用[5]所述)。例如: - `Android.mk` 中: `LOCAL_MODULE := mylib` - 输出文件:`libs/armeabi-v7a/libmylib.so` ### 4. **常见问题与提示** - **错误处理**:如果编译失败,检查 `Android.mk` 语法(如 `LOCAL_SRC_FILES` 路径是否正确)和 NDK 版本兼容性。 - **与 Gradle 集成**:在 Android Studio 中,您可以将 `ndk-build` 配置到 `build.gradle`(如引用[2]所述),但这不影响直接命令行使用。 - **性能优化**:通过 `Application.mk` 设置 `APP_ABI` 限制编译的 CPU 架构(如 `APP_ABI := armeabi-v7a`),以加速构建(如引用[4]所述)。 最后,确保所有命名一致(`Android.mk`、`System.loadLibrary` 和 Gradle 配置),避免运行时错误[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OneOnce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值