目的

基于 Android 平台,用 C/C++ 编写可执行的二进制程序,可以用 adb shell 执行。

环境

MacOS + NDK + 原生模拟器
ps : 可以先把 NDK 配置到环境变量里面

步骤

  1. 新建目录

    1
    mkdir -p hello/jni
  2. 进入 hello/jni 目录 , 创建文件

    1. Android.mk

      1
      2
      3
      4
      5
      6
      LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      LOCAL_MODULE := Execute
      LOCAL_SRC_FILES := Execute.c
      # BUILD_EXECUTABLE指明生成可执行的二进制文件
      include $(BUILD_EXECUTABLE)
    2. Application.mk

      1
      2
      3
      4
      5
      6
      7
      APP_PROJECT_PATH := $(call my-dir)/..
      # 注意和 NDK 版本对应 注意看 DNK/toolchains/下面目录名称末尾数字表示的版本号
      NDK_TOOLCHAIN_VERSION := 4.9
      # 这个在 NDK/platforms/ 目录下面选择合适的即可
      APP_PLATFORM := android-16
      APP_PIE := true
      APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti
    3. Execute.c

      1
      2
      3
      4
      5
      #include <stdio.h>
      int main() {
      printf("Hello world.\n");
      return 0;
      }

    参考目录结构如下

编译

进入 hello 目录 (注意不是 jni 目录,是外面那一层)

1
2
cd hello
ndk-build

执行结果如下:

文件目录如下:

其中 lib 目录里面就是对应 cpu 的可执行文件

测试

把机器对应的 cpu 可执行文件 拷贝到机器的 data/ 目录下,(注意:不是 /sdcard ) ,之后通过 adb shell 添加可执行权限,之后直接执行即可。

  1. 查看 cpu 架构类型

    1
    adb shell cat /proc/cpuinfo
  2. 拷贝可执行文件到机器

    1
    2
    adb push xxx/Execute /data
    (若不能直接拷贝,可以先拷贝到 /sdcard 再拷贝到 /data 目录)
  3. 修改可执行权限并执行

    1
    2
    3
    4
    adb shell
    cd /data
    chmod 777 Execute
    ./Execute
<<<<<<< HEAD