NDK编译系列:手机终端运行可执行文件的方法

  • Post author:
  • Post category:其他


NDK编译系列:手机终端运行可执行文件的方法



前言


该方式为PC上的NDK工具生成的可执行文件和库,利用adb导入到手机(未采用Andriod Studio生成带界面的apk文件),直接通过windows的命令窗在安卓原生linux环境上运行仿真。

利用前文博客总结梳理的方法,假设已经生成了可在手机终端运行的二进制文件和相关动态库,我们该如何在终端上跑起来呢?



总体流程


下面介绍相关手机终端运行可执行文件的流程。


手机硬仿流程:

  • 由NDK生成相关静态库(.a)/动态库(.so)
  • 用NDK链接动态库so,生成可执行exe

    • 若直接生成的exe,可跳过上一步
  • 用adb将exe文件和so库导入手机目录

    • 赋予相关可执行文件可执行的权限
    • 若有,则将相关输入序列或样本导入手机

      • adb push
      • adb pull
  • 手机上EXPORT下临时链接库,链接到so当前目录

    • 链接好所需要动态库
  • 运行可执行二进制文件,得到硬仿输出结果,如:

    ./DEMO

实战举例

  • 动态库:libhello.so
  • 可执行文件:main
  • 主调接收入参:1/2, 1:打印hello,2:打印bye
# 推入终端指定目录
adb push libhello.so /data/local/tmp
adb push main /data/local/tmp

# 声明链接库路径,可选
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp

# 命令窗进入手机终端
adb shell
cd /data/local/tmp
chmod 777 main

# 运行main,以当前目录作为链接库路径,入参1
LD_LIBRARY_PATH=./ ./main 1



补充说明



声明相关动态库链接路径的方法

  • 统一导入当前文件目录的动态库(仅当前运行阶段临时有效)

    • 如:

      export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp/test
  • 导入单个动态库(临时有效)

    • 如:

      export LD_PRELOAD=/usr/lib/gcc/aarch64-linux-gnu/7.5.0/libasan.so
  • 在运行exe指令前,添加链接路径

    • 如:

      LD_LIBRARY_PATH=./lib ./DEMO [参数1] [参数2] ...

如果运行可执行文件时,报找不到相关so库文件等,则可能是因为未进行上面操作。


运行可执行文件,报无可执行权限问题

  • 首先,用

    chmod 777 filename

    ,添加可读可写可运行的文件权限
  • 其次,若chmod 777无法加可执行权限,则考虑以下因素:

    • 注意adb shell推到

      sdcard

      路径中,没办法用chmod 777,来给文件添加可执行权限
    • 建议推到

      mnt

      或者

      data

      这种高权限目录下,才能加可执行权限



版权声明:本文为qq_17256689原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。