• android 平台 c 程序编译


    方法一:

    直接使用其它版本的交叉编译器,静态编译;

    方法二:

    利用 android 源码来进行编译;

    参考博客:编译Android平台运行的C程序

    方法三:

    使用 ndk、和 cmake 来编译;

    我的环境:

    1. liangtao:cmake_android$cmake -version
    2. cmake version 3.10.2
    3. CMake suite maintained and supported by Kitware (kitware.com/cmake).
    4. liangtao:cmake_android$uname -a
    5. Linux ubuntu 5.4.0-131-generic #147~18.04.1-Ubuntu SMP Sat Oct 15 13:10:18 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
    6. liangtao:cmake_android$

    NDK下载

    在官网下载最新的 NDK 就行,我使用的是 android-ndk-r25b-linux.zip ;

    将下载好的文件,解压到一个目录;

    1. # 我的目录是
    2. /opt/work/android-ndk-r25b

    NDK使用指南

    创建一个目录,用来放源码、CMakeLists.txt、外部构建脚本文件;

    1. # 我的目录是
    2. /opt/work/cmake_android
    3. # 在该目录下创建 3 个文件
    4. liangtao:cmake_android$ls -al
    5. total 20
    6. drwxrwxr-x 2 liangtao liangtao 4096 Nov 9 09:19 .
    7. drwxrwxr-x 11 liangtao liangtao 4096 Nov 9 09:07 ..
    8. -rw-rw-r-- 1 liangtao liangtao 200 Nov 9 09:13 CMakeLists.txt
    9. -rw-r--r-- 1 liangtao liangtao 107 Nov 9 09:08 main.c
    10. -rw-rw-r-- 1 liangtao liangtao 330 Nov 9 09:12 runhello.sh

    CMakeLists.txt 文件

    1. cmake_minimum_required(VERSION 3.6)
    2. project(hello_ndk)
    3. add_definitions("-Wall -g")
    4. add_executable(${PROJECT_NAME} main.c)
    5. install(TARGETS ${PROJECT_NAME}
    6. RUNTIME DESTINATION ${PROJECT_SOURCE_DIR})

    runhello.sh 文件

    因为我使用的平台是 android 6.0 的;所以 api 为 23;

    ABI 版本 和 NDK 目录,按各自的修改;

    1. #!/bin/bash
    2. export NDK=/opt/work/android-ndk-r25b
    3. export ABI=armeabi-v7a
    4. export MINSDKVERSION=23
    5. rm -r build
    6. mkdir build && cd build
    7. cmake \
    8. -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake \
    9. -DANDROID_ABI=$ABI \
    10. -DANDROID_PLATFORM=android-$MINSDKVERSION \
    11. -DANDROID_NDK=$NDK \
    12. ..
    13. make
    14. cd ..

    main.c 文件

    1. #include
    2. int main(int argc, char *argv[])
    3. {
    4. printf("Hello word.\n");
    5. return 0;
    6. }

    编译

    1. # 执行以下命令来编译
    2. . runhello.sh

    至于 CMake 的学习,B 站随便找个视频就行;

    另指定头文件和库文件方法如下:

    include_directories() 括号里填写自定义头文件路径,需要添加在 add_executable 之前;

    link_directories() 括号里填写自定义库文件路径,需要添加在 add_executable 之前;

    target_link_libraries() 括号里填写项目名、库文件名,需要添加在 add_executable 之后;

    例子:

    1. cmake_minimum_required(VERSION 3.6)
    2. project(hello_ndk)
    3. add_definitions("-Wall -g -DHELLO")
    4. include_directories(/opt/work/cmake_android)
    5. link_directories(/opt/work/cmake_android)
    6. add_executable(${PROJECT_NAME} main.c)
    7. target_link_libraries(${PROJECT_NAME} libhello.so)
    8. install(TARGETS ${PROJECT_NAME}
    9. RUNTIME DESTINATION ${PROJECT_SOURCE_DIR})

    如果 CMake 版本不符合要求,可以去官网下载一个高版本的 CMake;

    CMake_download​​​​​​

    解压后在 runhello.sh 中使用绝对路径就行;

    例:

    1. #!/bin/bash
    2. export NDK=/opt/liangtao/android-ndk-r25b
    3. export ABI=armeabi-v7a
    4. export MINSDKVERSION=23
    5. rm -r build
    6. mkdir build && cd build
    7. /opt/liangtao/cmake-3.6.0-Linux-x86_64/bin/cmake \
    8. -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake \
    9. -DANDROID_ABI=$ABI \
    10. -DANDROID_PLATFORM=android-$MINSDKVERSION \
    11. -DANDROID_NDK=$NDK \
    12. ..
    13. make
    14. cd ..

  • 相关阅读:
    【零基础学QT】第四章 控件学习方法,问卷调查小界面
    Revit建模如何一键“生成场地和基础垫层”
    PCI bar 解析
    百度资源搜索平台出现:You do not have the proper credential to access this page.怎么办?
    java 跨站攻击脚本过滤工具类
    神经网络中间层特征图可视化(输入为音频)
    java反序列化-CC1
    自动批量生成Notes应用测试数据!
    glide-源码解析-1
    Java以form-data(表单)的形式调用第三方接口
  • 原文地址:https://blog.csdn.net/liangtao_1996/article/details/127763259