ubuntu16.04上编译android的可执行文件并调用本地so库
前言:
找了蛮多资料的,发现目前实现的编译方式大致就两种,一种是直接使用android源码中的编译工具链,另一种就是使用独立的交叉编译工具链,第二种我还在实现中,配置步骤挺多的
,第一种实现方式挺方便的,不想折腾的就用第一种就好了。
1.先下载并配置ndk环境(根据自己机器的来选择要下载哪个版本,我这里用的是ubuntu)
下载地址:https://developer.android.google.cn/ndk/downloads/index.html
下载完成后,解压,unzip 下载好的zip包,结构如下图

这里的ndk-build是编译的主角,接着准备下一步
2.准备好要编译的源码文件
#include <unistd.h>
#include <stdio.h>
#include <dlfcn.h> typedef void (*pfnfoo)(void); int main()
{
void *handler = dlopen("/data/local/tmp/libTargetLibrary.so", RTLD_NOW);
if(NULL == handler)
{
printf("[-] dlopen fail");
return -1;
} pfnfoo foo = (pfnfoo)dlsym(handler, "foo"); foo();
return 0;
}
上面是加载本地so库的源码,流程也很简单,dlopen函数是打开加载so文件的,dlsym函数是找到我们要调用的jni函数,返回一个函数指针,其实安卓加载so文件核心也是这两步,只是帮我们封装好了,
这里建议看看android记载so文件的源码分析:https://www.jb51.net/article/136838.htm, 讲的挺不错的,很多时候看源码才能了解问题的本质是什么,源码看完,发现最后加载so文件的代码其实和
上面是差不多的,dlopen打开so文件,dlsym找到jni函数来进行调用。
3. 把ndk的环境变量配置好,类似windows的环境变量配置
因为我们最好是在工作目录下编译,如果命令行无法直接使用ndk-build命令会很麻烦,为了省事,无论在哪个目录都能使用ndk,所以配环境变量是必需的,这里vim打开/home/你的用户名
/.bashrc文件,将export PATH="$PATH:/home/你的用户名/android-ndk-r10(前面下载并解压的文件名)”,source .bashrc文件的路径,就配置完成了
4. 新建一个编译工作目录,将源码文件放入其中,并新建一个mk文件
在文件中写如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := HelloAndroid(编译后的可执行文件名字)
LOCAL_SRC_FILES :=HelloAndroid.c (源码文件名)
LOCAL_ARM_MODE :=arm
LOCAL_CFLAGS+= -pie -fPIE
LOCAL_LDFLAGS+= -pie -fPIE
include $(BUILD_EXECUTABLE)
5. 打开命令行,指定下采用我们编写的mk文件

然后发现目录中出现了两个新目录

6.libs是不是就是我们在android开发或者逆向中,非常常见的目录了,不过这次不是so文件,而是android上的可执行文件,因为我
mk文件上配置是要可执行文件的,所以编译so文件的话,你懂的。libs下面根据你的手机机器架构进行选择,然后push到手机上
给个777的权限,然后把本地要调用的so库放到源码中指定的目录下,方便它查找。
参考链接:
https://blog.csdn.net/u010651541/article/details/50177867
https://www.cnblogs.com/xieyajie/p/4727706.html
ubuntu16.04上编译android的可执行文件并调用本地so库的更多相关文章
- 在ubuntu16.04上编译android源码【转】
本文转载自:http://blog.csdn.net/fuchaosz/article/details/51487585 1 前言 经过3天奋战,终于在Ubuntu 16.04上把Android 6. ...
- 【转】Ubuntu10.04上编译Android源码(Build Android source in Ubuntu10.04 Platform)
原文网址:http://blog.csdn.net/chenyafei617/article/details/6570928 一.Introduction 今天我们就来谈谈如何在Ubuntu平台上面编 ...
- 【转】Linux(ubuntu14.04)上编译Android4.4源码的环境搭建及编译全过程
原文网址:http://jileniao.net/linux-android-building.html sublime text让我伤心.本来很信任sublime text的自动保存功能,之前使用一 ...
- 【MindSpore】Ubuntu16.04上成功安装GPU版MindSpore1.0.1
本文是在宿主机Ubuntu16.04上拉取cuda10.1-cudnn7-ubuntu18.04的镜像,在容器中通过Miniconda3创建python3.7.5的环境并成功安装mindspore_g ...
- 在Ubuntu Server14.04上编译Android6.0源码
此前编译过Android4.4的源码,但是现在Android都到了7.0的版本,不禁让我感叹Google的步伐真心难跟上,趁这周周末时间比较充裕,于是在过去的24小时里,毅然花了9个小时编译了一把An ...
- 【转】Ubuntu 上编译Android出现cannot find -lstdc++解决办法
[转]Ubuntu 上编译Android出现cannot find -lstdc++解决办法 在Ubuntu 12.04 x86_64机器上编译Android出现下面错误,是因为找不到32bit的li ...
- Ubuntu16.04上安装cudnn教程和opencv
https://blog.csdn.net/wang15061955806/article/details/80791112 Ubuntu16.04上安装cudnn教程 2018年06月24日 14: ...
- 在Ubuntu 16.04上编译OpenJDK8的源代码
本文将详细介绍在Ubuntu16.04上对OpenJDK8进行编译. 1.准备编译环境 使用的操作系统为Ubuntu16.04,如果读者没有安装Ubuntu,可以在Windows上使用虚拟机的方式进行 ...
- Ubuntu16.04下编译安装OpenCV3.4.0(C++ & python)
Ubuntu16.04下编译安装OpenCV3.4.0(C++ & python) 前提是已经安装了python2,python3 1)安装各种依赖库 sudo apt-get update ...
随机推荐
- window系统安装mysql
下载地址(其他图形界面) https://dev.mysql.com/downloads/windows/installer/如果下载win7 64位,在下载后出现不兼容,可以在window窗口菜单中 ...
- 3d分层悬停效果
3d分层悬停效果 写在前面 经过了2个星期的努力,我回来了!会继续将我学习路上遇到的问题,以及一些笔记,demo分享给大家 实现效果 致我最爱的backpink 实现思路 将6张图片,通过定位叠在一起 ...
- Spring-Cloud之Feign原理剖析
Feign 主要是帮助我们方便进行rest api服务间的调用,其大体实现思路就我们通过标记注解在一个接口类上(注解上将包含要调用的接口信息),之后在调用时根据注解信息组装好请求信息,接下来基于rib ...
- 为什么edge AI是一个无需大脑的人
为什么edge AI是一个无需大脑的人 Why edge AI is a no-brainer 德勤预计,到2020年,将售出超过7.5亿个edge AI芯片,即在设备上而不是在远程数据中心执行或加速 ...
- webgl变换:深入图形平移
在以前的文章里,不管是绘制图形,绘制点亦或者是改变色值,所有的内容都是静态的. 在 webgl 里,图形的运动分为 平移.旋转.缩放 三种类型. 接下来,我们会从零基础开始,一点一点来深入了解图形如何 ...
- Mysql数据库值的添加、修改、删除及清空
3.MySQL数据管理 第一种方式:不太建议,看起来复杂些 -- 学生表的 gradeid 字段,要去引用 年级表的 gradeid -- 定义外键key -- 给这个外键添加约束,(执行引用),RE ...
- 小Z的袜子(hose) &&作业 (莫队)
莫队:一种非常优雅的暴力,时间复杂度一般情况下是n*根号n,还是很优秀的. 今天水了三道莫队题,对普通莫队有了些了解 1.莫队l和r为指针,维护当前区间的某些信息,一般可以是当前区间不同权值的个数,( ...
- MySQL 为什么使用 B+ 树来作索引?
什么是索引? 所谓的索引,就是帮助 MySQL 高效获取数据的排好序的数据结构.因此,根据索引的定义,构建索引其实就是数据排序的过程. 平时常见的索引数据结构有: 二叉树 红黑树 哈希表 B Tree ...
- docker2-镜像原理及创建新的镜像
1,镜像是什么 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件 在docker中所有应用 ...
- url参数接收的一些安全应用场景
越权漏洞,从原来的修改id越权到后面的自己加参数,减参数越权,到现在的加特殊字符.攻击手段在进步: 以php和java为例,聊聊参数接收的最大接受能力,可以插入哪些脏数据? demo1.php: &l ...