Android so(ELF) 文件解析

前言

ELF 是一种可执行文件的格式,全称是 Executable and Linkable Format,即可执行和链接格式,它是 Unix/Linux 系统下的二进制文件的标准格式,与之对应的是 Windows 系统的 PE(Portable Executable)可执行文件格式,它们都是由 COFF(Common Object File Format,通用对象文件格式)文件格式发展而来。

so 文件是 Unix/Linux 系统中的动态库文件,被称为共享目标文件(Shared Object File),后缀名为 .so,它是 ELF 的一种,另外属于 ELF 类型的还有可重定位文件(Relocatable File)以及核心转储文件(Core Dump File)。

阅读更多

Android JNI 指南

前言

编写此文档的用意:

作为 Android NDK 项目开发的参考手册。

对于 NDK 工程的搭建可参考 Android NDK 指南

JNI 简介

JNI(Java Native Interface,Java 原生接口),是 Java 和 C++ 组件用以互相通信的接口。

Android 平台下的 JNI 支持由 Android NDK 提供,它是一套能将 C 或 C++(原生代码)嵌入到 Android 应用中的工具。

为什么要使用 JNI 在 Android 平台下进行编程:

  1. 在平台之间移植应用;
  2. 重复使用现有库,或者提供自己的库供重复使用;
  3. 在某些情况下提供高性能,特别是像游戏这种计算密集型应用;
  4. 提供安全性保障,在二进制层面比字节码层面的逆向工作更加困难。
阅读更多

Android NDK 指南

前言

编写此文档的用意:

  1. 作为搭建基础 NDK 工程的教程;
  2. 作为入门 NDK 工程的参考手册。

NDK 工程构建

可采用三种方式进行 NDK 工程的构建:

  1. 基于 Make 的 ndk-build,这是传统的 ndk-build 构建方式,使用 Makefile 方式进行构建,简洁高效;
  2. CMake 是新型的构建方式,CMake 具有跨平台的特性,通过 CMake 生成 Makefile 后再进行构建,CMake 的配置文件可读性更高;
  3. 其他编译系统,通过引入其他编译系统可对编译过程进行定制,例如引入 obfuscator-llvm 对源码进行混淆和压缩,增强源代码安全性。

下面是每种构建方式的基础示例,使用 Android Studio 4.0 和 NDK 21 进行如下构建。

阅读更多

Makefile 指南

前言

此文档内容是对于博客 跟我一起写Makefile 的归纳整理。

规范了文档格式,重构为参考手册的形式,不适合作为教程,适合作为参考。

Makefile 介绍

编写原则

  1. 如果这个工程没有编译过,那么所有的 C 文件都需要编译并链接;
  2. 如果这个工程的某几个 C 文件被修改,那么只编译被修改的 C 文件,并连接目标程序;
  3. 如果这个工程的头文件被改变了,那么需要编译引用了这几个头文件的 C 文件,并连接目标程序。
阅读更多