zoukankan      html  css  js  c++  java
  • android Android NDK开发2之Windows及L下的gcc手动编译(交叉连编译

    转载自 //https://www.52pojie.cn/thread-549754-1-1.html

    作者 //牵走天涯

    时间 2020 11 23 0:17

    {

    一、交叉工具链
    这些工具都在NDK的路径下:E:Androidandroid-ndk-r13 oolchainsarm-linux-androideabi-4.9prebuiltwindows-x86_64in
    这些工具的前缀均为arm-linux-androideabi,可以直接使用他们来编写NDK原生程序
    Windows和Linux平台使用的gcc都是一样的,命令参数也是一样的:
    arm-linux-androideabi-addr2line  //将程序地址转换为文件名和行号
    arm-linux-androideabi-ar  // 建立、修改、提取归档文件
    arm-linux-androideabi-as  //gas汇编器
    arm-linux-androideabi-c++  //工具链中arm-linux-androideabi-g++.exe的一个拷贝
    arm-linux-androideabi-c++filt  //连接器使用它过滤符号,防止重载函数冲突
    arm-linux-androideabi-cpp  //C++程序编译工具
    arm-linux-androideabi-g++  //C++程序编译工具
    arm-linux-androideabi-gcc-4.9.x //工具链中arm-linux-androideabi-gcc.exe的一个拷贝
    arm-linux-androideabi-gcc  //C程序编译工具
    arm-linux-androideabi-gcov  //程序覆盖度测量工具,记录代码的执行路径
    arm-linux-androideabi-gdb  //调试工具
    arm-linux-androideabi-gprof  //程序性能测量工具
    arm-linux-androideabi-ld  //连接器,用于生成可执行程序
    arm-linux-androideabi-nm  //列出目标文件中的符号
    arm-linux-androideabi-objcopy  //复制目标文件中的内容到另一种类型的目标文件中
    arm-linux-androideabi-objdump  //输出目标文件的信息
    arm-linux-androideabi-ranlib  //产生归档文件索引,并将其保存到这个归档文件中
    arm-linux-androideabi-readelf  //显示elf格式可执行文件的信息
    arm-linux-androideabi-run  //ARM程序模拟器
    arm-linux-androideabi-size  //列出目标文件每一段的大小及总体的大小
    arm-linux-androideabi-strings  //输出目标文件的可打印字符串
    arm-linux-androideabi-strip  //去除目标文件中的符号信息
    以上摘录之《Android软件安全与逆向分析》

    二、编写C++程序
    我这里习惯使用VS2012,大家可以按自己的习惯。记事本都可以。


    [C] 纯文本查看 复制代码
    1
    2
    3
    4
    #include <stdio.h>
    void main(){
           printf("Hello,you are successful !");
    }





    三、编写makefile


    注意:1.斜杠的方向(千万不要弄反了,这个很重要!!!)
                2.把我makefile中 的//以及后面的内容删除!
                3.一定记得先配置环境
    最后给这个makefile文档
    [Asm] 纯文本查看 复制代码
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    NDK_ROOT=E:/Android/android-ndk-r13
    TOOLCHAINS_ROOT=$(NDK_ROOT)/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
    TOOLCHAINS_PREFIX=$(TOOLCHAINS_ROOT)/bin/arm-linux-androideabi
    TOOLCHAINS_INCLUDE=$(TOOLCHAINS_ROOT)/lib/gcc/arm-linux-androideabi/4.9.x/include-fixed
     
    PLATFORM_ROOT=$(NDK_ROOT)/platforms/android-17/arch-arm
    PLATFORM_INCLUDE=$(PLATFORM_ROOT)/usr/include
    PLATFORM_LIB=$(PLATFORM_ROOT)/usr/lib
     
    MODULE_NAME=HelloNDK
    RM=del
     
    FLAGS=-I$(TOOLCHAINS_INCLUDE)
        -I$(PLATFORM_INCLUDE)
        -L$(PLATFORM_LIB)
        -nostdlib
        -lgcc
        -Bdynamic
        -lc
     
    OBJS=$(MODULE_NAME).o
        $(PLATFORM_LIB)/crtbegin_dynamic.o
        $(PLATFORM_LIB)/crtend_android.o
     
    all:
        $(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -c $(MODULE_NAME).c -o $(MODULE_NAME).o
        $(TOOLCHAINS_PREFIX)-gcc $(FLAGS) $(OBJS) -o $(MODULE_NAME)
    clean:
        $(RM) *.o
    install:
        adb push $(MODULE_NAME) /data/local/
        adb shell chmod 755 /data/local/$(MODULE_NAME)



    四、编译

    我们把这些东西弄好了放到桌面上的文件夹gccNDKtest。
    然后cmd命令打开这个文件夹
    然后make
    看到是这个样子,就说明没有问题了


    接下来,我们需要看效果,就需要一个Android的手机或者模拟器了。
    依次输入
    make install
    adb shell /data/local/HelloNDK
    就可以看到效果图了



    五、Linux
    和Windows差不多,重点是环境需要配置好
    我直接把Windows里面的C放进去,再编写makefile
    makefile如下
    [Asm] 纯文本查看 复制代码
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    NDK_ROOT=/home/tools/android-ndk-r13
    TOOLCHAINS_ROOT=$(NDK_ROOT)/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
    TOOLCHAINS_PREFIX=$(TOOLCHAINS_ROOT)/bin/arm-linux-androideabi
    TOOLCHAINS_INCLUDE=$(TOOLCHAINS_ROOT)/lib/gcc/arm-linux-androideabi/4.9.x/include-fixed
     
    PLATFORM_ROOT=$(NDK_ROOT)/platforms/android-17/arch-arm
    PLATFORM_INCLUDE=$(PLATFORM_ROOT)/usr/include
    PLATFORM_LIB=$(PLATFORM_ROOT)/usr/lib
     
    MODULE_NAME=HelloNDK
    RM=rm -rf
     
    FLAGS=-I$(TOOLCHAINS_INCLUDE)
        -I$(PLATFORM_INCLUDE)
        -L$(PLATFORM_LIB)
        -nostdlib
        -lgcc
        -Bdynamic
        -lc
     
    OBJS=$(MODULE_NAME).o
        $(PLATFORM_LIB)/crtbegin_dynamic.o
        $(PLATFORM_LIB)/crtend_android.o
     
    all:
        $(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -c $(MODULE_NAME).c -o $(MODULE_NAME).o
        $(TOOLCHAINS_PREFIX)-gcc $(FLAGS) $(OBJS) -o $(MODULE_NAME)
    clean:
        $(RM) *.o
    install:
        adb push $(MODULE_NAME) /data/local/
        adb shell chmod 755 /data/local/$(MODULE_NAME)



    然后放到Linux下面去,到这个文件的目录下make就OK的。

    命令是
    sorgs@sorgs-VirtualBox:/home/tools/gccNDKtest$ sudo make

    这个就说明编译成功了。
    因为我这Linux是虚拟机,所以不好用手机真是去测试
    所以手续的测试就在Windows上测试的,效果和上面的一样。
    六、总结
    虽然看起来这很简单,但是实际上自己不去动手,永远不知道这点点东西来的多么艰辛,各种百度查。
    其实这个还遗留了一个问题。本来说好的NDK用gcc编译,是可以编译C++的,但是我写了一个C++。不管怎么修改makefile都要报错。这个问题我查了很多资料,都没有结果。我在想等下,有空了,去问问我们的老师,看看能不能给出答案。如果可以的话,再回来更新,编写一个C++的代码尝试编译。
    然后就是Linux,我的天啊。我之前都没有学过这个,然后为了写出来来尝试,才开始研究。各种报错,各种重装。
    你不去动手,永远不知道这里面的辛酸和晚上连续几天熬夜到12点的汗水以及成功之后的喜悦。
    所以说,不要看着简单,要实际去做做!
    链接:http://pan.baidu.com/s/1boNj4IF 密码:w4ec



    }

  • 相关阅读:
    openstack nova创建虚拟机过程(DEBUG)从接收到cli RESTFul请求到给scheduler发送rpc消息
    openstack源码阅读基础:openstack中Nova组件RESTful请求的具体处理函数确定
    博客园第一搏——Html5 JumpStart学习笔记1:Semantic Structure
    我的CSDN博客http://blog.csdn.net/kuangjian007,欢迎骚扰!
    django第一课:基本介绍
    pku 1142 Smith Number
    使用Eclipse开发X3D
    javascript树形控件第二版
    三种方式获得int的size
    细节决定成败
  • 原文地址:https://www.cnblogs.com/YZFHKMS-X/p/14022445.html
Copyright © 2011-2022 走看看