标题 android开发环境搭建以及交叉编译
1. 配置java+android studio+android sdk+ndk+cmake开发环境
1.1. Windows下配置android环境的步骤:
- 安装jdk,配置系统环境
- 安装android studio
- 在android studio中下载安装sdk、ndk和cmake,配置系统环境
1.2. JNI概述
JNI 是 Java Native Interface 的缩写,译为 Java 本地接口。它允许 Java 代码和其他语言编写的代码进行交互。在android 中提供 JNI 的方式,让 Java 程序可以调用 C/C++语言程序。 android 中很多 Java 类都具有 native 接口,这些接口由本地实现,然后注册到系统中。在android系统中实现JNI库需要连接.so共享库,如:lib<文件名>.so。
1.3. NDK概述
Android NDK是一个工具集,让你的Android应用程序里可以内嵌使用本地代码(C/C++)的组件。Android应用程序运行在Dalvik虚拟机中。NDK可以让你使用C/C++这样的本地代码语言来实现你的应用程序中某些部分。这对某类程序是有帮助的,比如需要重用已有的C代码,或者为了提高运行速度。
NDK 提供:
1). 编译文件和工具集,用来将你的C/C++源文件编译成本地库。
2). 提供一种方式,将对应的本地库内嵌到应用程序包文件(.apk)中,最终发布到Android设备中。
3). 本地系统头文件和库,这些头文件和库从Android1.5开始往后都是被支持的。但使用本地活动(native activity)的程序只能运行在Android 2.3或更高的系统中。
4). 文档、示例、指南。
2. 交叉编译
2.1. 概述
交叉编译(Cross-Compilation)是指在一台主机上编译生成在另一种不同的目标平台上运行的可执行文件。这个主机通常被称为“主机系统”或“开发主机”,而目标平台则被称为“目标系统”。
在交叉编译过程中,开发主机和目标系统具有不同的体系结构、处理器架构或操作系统。例如,您可以在 x86 电脑上使用 GCC 编译器将 C/C++ 代码交叉编译成 ARM 架构的可执行文件,以在 ARM 设备上运行。
2.2. 一般流程:
- 准备交叉工具链:交叉工具链包括针对目标系统的交叉编译器、链接器和库文件等。这些工具用于在开发主机上生成适合目标系统的二进制文件。
- 配置编译环境:设置环境变量和路径,以便编译器和链接器能够正确找到所需的头文件、库文件和工具链。
- 编写源代码:根据目标系统的要求,编写适当的源代码,包括应用程序或库的功能实现。
- 配置编译选项:通过编译选项指定目标系统的体系结构、处理器类型、操作系统版本等参数。这些选项通常包括指定目标架构、ABI(Application Binary Interface)、优化级别等。
- 进行交叉编译:使用交叉工具链进行编译和链接操作,生成适合目标系统的可执行文件或库文件。
- 部署和运行:将生成的可执行文件或库文件部署到目标系统上,并在目标环境中运行测试。
2.3. 示例
Linux下交叉编译在安卓平台运行的可执行文件的两种方法(都是使用NDK自带的工具链)如下:
- 使用CMake + NDK
CMakeLists.txt文件代码如下:
cmake_minimum_required(VERSION 3.0)
project(ndk_test)
add_definitions("-Wall -g")
add_executable(${PROJECT_NAME} ./Example/ndk_test.cpp )
install(TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION ${PROJECT_SOURCE_DIR})
编译CMakeLists.txt的SHELL脚本代码如下:
rm -r build
mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=$NDKROOT/build/cmake/android.toolchain.cmake \
-DANDROID_ABI="armeabi-v7a" \
-DANDROID_NDK=$NDKROOT \
-DANDROID_PLATFORM=android-22 \
..
make && make install
cd ..
- 单独使用NDK的ndk-build指令
Android.mk文件代码如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES:= mmc.c mmc_cmds.c lsmmc.c
LOCAL_SRC_FILES += 3rdparty/hmac_sha/sha2.c 3rdparty/hmac_sha/hmac_sha2.c
LOCAL_MODULE := mmc_utils
LOCAL_LDLIBS += -lc
LOCAL_C_INCLUDES+= $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
LOCAL_ADDITIONAL_DEPENDENCIES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA)/mmc-utils
include $(BUILD_EXECUTABLE)
编译Android.mk的SHELL脚本代码如下:
ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk