zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    Struts2声明式异常处理
    几种常用的过滤器
    Jdk 和 Tomcat的 安装。(旧版本,请看新版本3篇)
    java 判断字符串是否相等
    PreparedStatement 查询 In 语句 setArray 等介绍。
    String、StringBuffer与StringBuilder之间区别
    IntelliJ IDEA 里 查看一个函数注释的方法是 ctrl+q
    Java字符串拼接效率对比
    Java 中判断字符串是否为空
    IntelliJ IDEA + Tomcat ;On Upate Action 与 On Frame Deactivation
  • 原文地址:https://www.cnblogs.com/YenKoc/p/14287957.html
Copyright © 2011-2022 走看看