前言:

  找了蛮多资料的,发现目前实现的编译方式大致就两种,一种是直接使用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库的更多相关文章

  1. 在ubuntu16.04上编译android源码【转】

    本文转载自:http://blog.csdn.net/fuchaosz/article/details/51487585 1 前言 经过3天奋战,终于在Ubuntu 16.04上把Android 6. ...

  2. 【转】Ubuntu10.04上编译Android源码(Build Android source in Ubuntu10.04 Platform)

    原文网址:http://blog.csdn.net/chenyafei617/article/details/6570928 一.Introduction 今天我们就来谈谈如何在Ubuntu平台上面编 ...

  3. 【转】Linux(ubuntu14.04)上编译Android4.4源码的环境搭建及编译全过程

    原文网址:http://jileniao.net/linux-android-building.html sublime text让我伤心.本来很信任sublime text的自动保存功能,之前使用一 ...

  4. 【MindSpore】Ubuntu16.04上成功安装GPU版MindSpore1.0.1

    本文是在宿主机Ubuntu16.04上拉取cuda10.1-cudnn7-ubuntu18.04的镜像,在容器中通过Miniconda3创建python3.7.5的环境并成功安装mindspore_g ...

  5. 在Ubuntu Server14.04上编译Android6.0源码

    此前编译过Android4.4的源码,但是现在Android都到了7.0的版本,不禁让我感叹Google的步伐真心难跟上,趁这周周末时间比较充裕,于是在过去的24小时里,毅然花了9个小时编译了一把An ...

  6. 【转】Ubuntu 上编译Android出现cannot find -lstdc++解决办法

    [转]Ubuntu 上编译Android出现cannot find -lstdc++解决办法 在Ubuntu 12.04 x86_64机器上编译Android出现下面错误,是因为找不到32bit的li ...

  7. Ubuntu16.04上安装cudnn教程和opencv

    https://blog.csdn.net/wang15061955806/article/details/80791112 Ubuntu16.04上安装cudnn教程 2018年06月24日 14: ...

  8. 在Ubuntu 16.04上编译OpenJDK8的源代码

    本文将详细介绍在Ubuntu16.04上对OpenJDK8进行编译. 1.准备编译环境 使用的操作系统为Ubuntu16.04,如果读者没有安装Ubuntu,可以在Windows上使用虚拟机的方式进行 ...

  9. Ubuntu16.04下编译安装OpenCV3.4.0(C++ & python)

    Ubuntu16.04下编译安装OpenCV3.4.0(C++ & python) 前提是已经安装了python2,python3 1)安装各种依赖库 sudo apt-get update ...

随机推荐

  1. python 解析html网页

    pyquery库是jQuery的Python实现,可以用于解析HTML网页内容,使用方法: 代码如下: from pyquery import PyQuery as pq 1.可加载一段HTML字符串 ...

  2. [leetcode] 39. 组合总和(Java)(dfs、递归、回溯)

    39. 组合总和 直接暴力思路,用dfs+回溯枚举所有可能组合情况.难点在于每个数可取无数次. 我的枚举思路是: 外层枚举答案数组的长度,即枚举解中的数字个数,从1个开始,到target/ min(c ...

  3. [leetcode] 30. 与所有单词相关联的字串(cn第653位做出此题的人~)

    30. 与所有单词相关联的字串 这个题做了大概两个小时左右把...严重怀疑leetcode的judge机器有问题.同样的代码交出来不同的运行时长,能不能A题还得看运气? 大致思路是,给words生成一 ...

  4. Step By Step(C调用Lua)

    Step By Step(C调用Lua) 1. 基础:    Lua的一项重要用途就是作为一种配置语言.现在从一个简单的示例开始吧.    --这里是用Lua代码定义的窗口大小的配置信息    wid ...

  5. 先进一站式IP及定制

    先进一站式IP及定制 芯动科技15年来立足中国本土,目前已实现从130nm到5nm工艺高速混合电路IP核全覆盖,且所有IP均自主可控,一站式赋能国产芯片发展. 提供经过批量生产验证或硅验证的IP产品, ...

  6. nvJPEG库

    nvJPEG库 GPU加速的JPEG解码器,编码器和代码转换器 nvJPEG库是高性能的GPU加速库,用于解码,编码和转码JPEG格式的图像.nvJPEG2000库用于解码JPEG 2000格式的图像 ...

  7. .Net RabbitMQ实战指南——进阶(二)

    持久化 持久化可以提高RabbitMQ的可靠性,防止异常情况下的数据丢失.RabbitMQ的持久化分为三个部分:交换器的持久化.队列的持久化和消息的持久化. 交换器的持久化通过声明队列时将durabl ...

  8. Nginx虚拟主机流量状态模块(nginx-module-vts)使用说明文档(四)

    装完NG,为了拿到各种状态指标,就要对NG做监控. Github 2.3k的开源项目nginx-module-vts没准真是你需求的. 链接数,qps,1xx.2xx,.3xx.4xx.5xx的响应数 ...

  9. JSON.parse无双引号如何实现转换

    用JSON.parse()做转换,必须用双引号包起来.但是我用chrome的devtools时,它可以自动转换.于是上网查了一下,原来可以通过replace方法格式化一下.(修改后可以兼容日期格式) ...

  10. 听说你还不知道Java代码是怎么运行的?

    作为一名Java程序员,我们需要知道Java代码是怎么运行的.最近复习了深入理解Java虚拟机这本书,做了一下笔记,希望对大家有帮助,如果有不正确的地方,欢迎提出,感激不尽. java 代码运行主要流 ...