linux_交叉编译android库

1,162 阅读3分钟

一、安装rz/sz命令

1.linux系统下安装rz/sz命令

源码安装:

1)通过该指令下载源码:wget http://www.ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz
2)解压该压缩包:tar zxvf lrzsz-0.12.20.tar.gz
3)进入文件夹:cd lrzsz-0.12.20
4)安装:./configure && make && make install
5)进入安装的路径:cd /usr/local/bin
6)ln -s /usr/local/bin/lrz rz 【设置快捷方式 相当于win】
7)ln -s /usr/local/bin/lsz sz 【设置快捷方式 相当于win】

中间遇到的问题汇总(ubuntu):

1)一定要在root权限下进行上述操作,否则在安装的时候需要root权限才能执行。

2)./configure && make && make install 执行的错误

image.png

ubuntu要执行这个指令来进行安装:sudo apt install 'g++'

3)继续安装还会出错如图,但给了解决办法。继续安装即可

image.png

sudo apt install make

4)没有权限

image.png

于是切换成root权限,重新了以上步骤,安装完成。

2.导入到linux系统,导出到win系统的指令

1)sz 文件名:把文件导出到win系统。

2)rz :导入到当前目录。

在win10自带的ubuntu是无法使用这两个命令的,这两个命令是为了方便的往服务器发送和下载东西用的。
如果不是服务器可以直接从下面目录找到linux系统的目录,去进行文件的下载和拉取。

C:\Users\Administrator\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState\rootfs\home

2. 下载linux的NDK

  1. wget dl.google.com/android/rep…

  2. 修改成.zip:mv android-ndk-r17c-linux-x86_64.zip?hl=zh_cn android-ndk-r17c-linuxx86_64.zip

  3. 解压:unzip android-ndk-r17c-linux-x86_64.zip

3.如何查看android设备的cpu架构。

  1. adb shell

  2. cat /proc/cpuinfo

4.如何编译代码。

1.需要找到NDK里对应平台的GCC工具。/android/toolchains/arm.../.....GCC

2.需要导入相关的库文件。"--sysroot=绝对路径(ndk/platefrom/android-相应版本/arch-arm 到user目录下的pwd)" "--sysroot="的意思是在次路径下自动寻找头文件和库文件。(此时的目录下只有库文件)

3.配置头文件:"ndk/systemroot/user/include"目录下面 在上个路径下继续拼接" -isystem 路径"。(中间有两个空格)"-isystem"只查找头文件

4.确少asm的头文件,还需要在"ndk/systemroot/user/include/arm里找"同步骤三继续拼接。

5.在android中运行会报确少PIE的标记。(pie是可执行程序的标记)

最后的编译代码:

   $NDK_GCC -pie $AAA main.c -o mainNDKEXE
   

5.库的生成

1.linux下的动态库生成。

gcc -fPIC -shared get.c -o libget.so

2.android下动态库生成 交叉编译

$NDK_GCC_arm $NDK_CFIG_arm -fPIC -shared get.c -o libgetndk.so

3.linux下的静态库生成。

1.必须要有目标文件***.o
    
    gcc -fPIC -c get.c -o get.o 【-c 产生目标文件 xxx.o    -o 输出get.o】

2.才能生成静态库。

    ar rcs -o libget.a get.o 【get.o是静态库需要生成的源文件,并不是 xxx.c】

4.android下静态库生成 交叉编译

1.交叉编译生成***.so

    $NDK_GCC_arm $NDK_CFIG_arm -fPIC -c get.c -o getndk.o
    
2.生成静态库

    $NDK_AR_arm rcs -o libgetndk.a getndk.o
    

6.android导入动态和静态库。

cmake 先进行批量导入
    file(GLOB allcpp *.cpp)

1.导入静态库。

1)静态库可以放在cpp文件夹下面。

2)导入静态库
  add_library(getndk STATIC IMPORTED)
  set_target_properties(getndk PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libgetndk.a)
  
3)连接静态库
  把getndk加入到target_link_librarys()里。
  
4)声明方法要extern "C"

2.导入动态库。

1)动态库要放在main/jniLibs/armeabi-v7a下。或者自定义路径
sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}
2)导入动态库:
  add_library(getndk SHARE IMPORTED)
  set_target_properties(getndk PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}/libgetndk.so)
  
  ${CMAKE_ANDROID_ARCH_ABI}这个需要在build里配置了cmake才能找到。
3)在代码中load进去
static {
  System.loadLibrary("getndk");
}