方法一:

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

方法二:

利用 android 源码来进行编译;

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

方法三:

使用 ndk、和 cmake 来编译;

我的环境:

liangtao:cmake_android$cmake -version
cmake version 3.10.2CMake suite maintained and supported by Kitware (kitware.com/cmake).
liangtao:cmake_android$uname -a
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
liangtao:cmake_android$

NDK下载

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

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

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

NDK使用指南

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

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

CMakeLists.txt 文件

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

runhello.sh 文件

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

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

#!/bin/bashexport NDK=/opt/work/android-ndk-r25b
export ABI=armeabi-v7a
export MINSDKVERSION=23rm -r build
mkdir build && cd build cmake \-DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake \-DANDROID_ABI=$ABI \-DANDROID_PLATFORM=android-$MINSDKVERSION \-DANDROID_NDK=$NDK \..makecd ..

main.c 文件

#include <stdio.h>int main(int argc, char *argv[])
{printf("Hello word.\n");return 0;
}

编译

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

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

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

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

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

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

例子:

cmake_minimum_required(VERSION 3.6)
project(hello_ndk)add_definitions("-Wall -g -DHELLO")include_directories(/opt/work/cmake_android)
link_directories(/opt/work/cmake_android)
add_executable(${PROJECT_NAME} main.c)
target_link_libraries(${PROJECT_NAME} libhello.so)install(TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION ${PROJECT_SOURCE_DIR})

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

CMake_download​​​​​​

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

例:

#!/bin/bashexport NDK=/opt/liangtao/android-ndk-r25b
export ABI=armeabi-v7a
export MINSDKVERSION=23rm -r build
mkdir build && cd build/opt/liangtao/cmake-3.6.0-Linux-x86_64/bin/cmake \-DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake \-DANDROID_ABI=$ABI \-DANDROID_PLATFORM=android-$MINSDKVERSION \-DANDROID_NDK=$NDK \..makecd ..

android 平台 c 程序编译相关推荐

  1. 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)

    作者 : 韩曙亮  博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csd ...

  2. android系统firefox,Android平台Firefox——Fennec编译手记

    Android平台Firefox--Fennec编译手记 Firefox for mobile,开发代号为Fennec.详情参见维基百科:Click here! 官方手册 1)准备环境 1.1)安装J ...

  3. 基于Android平台的ffmpeg编译

    前面介绍了Android jni 相关知识,但jni最终还是要调用的第三方的C/C++库,这里我们以ffmpeg为例,介绍第三方C/C++如何编译成android 版本. 一.基本原理 关于Andro ...

  4. phonegap编译Android,PhoneGap应用程序编译

    现在我们可以编译第一个网络API基于快速模式的应用程序.在这最后的环节中,我们将学习转化我们的网络内容的应用程序格式,可以在在线应用程序商店上载的过程. PhoneGap接受GitHub上或使用Ado ...

  5. IDA+GDB远程调试android平台 - Aarch64- elf64程序

    gdb配置 gdb和gdbserver gdbserver的是在 android-ndk-r10e\prebuilt\android-arm\gdbserver 这个目录下 gdb 是在 androi ...

  6. Unity3D 加密 Assembly-CSharp.dll (Android平台) 防止反编译

    本文固定链接:http://blog.csdn.net/u013108312/article/details/54234439 0.加密的原理 Unity3D 是基于 Mono的,我们平时写的 C# ...

  7. 基于NDK编译Android平台的FFmpeg动态库

    需求 FFmpeg在Linux平台(如Ubuntu)上的支持已经比较完善了,如前述文章介绍 http://blog.csdn.net/ericbar/article/details/73702061, ...

  8. Cmake NDK交叉编译Android平台程序

    当我们需要把我们的C++程序编译成Android平台的so库时,就需要用到交叉编译,有两种方法 目录 一:利用NDK进行编译 1.首先安装NDK 2.直接cmake, 二,独立的交叉编译工具链 1.安 ...

  9. Webrtc入门——基于阿里云ubuntu 最新webrtc Android平台编译详细说明

    折腾了好多天,终于将webrtc Android平台的demo编译出来了,发现即使完全按照webrtc官网的编译指南,还是会碰到各种问题.而网上又没有更全面的说明,最后是通过查看webrtc 批处理脚 ...

最新文章

  1. 表达不同与构建不同: 对计算机的唯一真正的要求 (TrustNo.1 ) -- 待修改!!!...
  2. 【转发】关于Java性能的9个谬论
  3. c enum能像java一样吗_Java枚举替代我如何做到这一点?
  4. Spring Cloud(七) GateWay 服务化和过滤器
  5. SQL中Group By的使用,以及一些特殊使用方法
  6. double 去掉小数点_JAVA编程有一个小数,如何去掉小数部分
  7. 搭建hexo博客并部署到github上
  8. Android通知学习
  9. linux rpm
  10. acid事务 mysql_MySQL 事务ACID特性
  11. 【0610】【数据结构】【C语言版视频教程】【 全52讲 完整版】
  12. 关于建立企业邮箱的解决方案
  13. php 视频分割,如何把一个视频分成两段或多段 视频切割软件
  14. wangEditor富文本自定义图片宽度
  15. 【jq练习】层次选择器
  16. html5实现短信验证修改密码,thinkphp5如何调用云片接口实现发送短信验证码找回密码功能...
  17. Unity Live2D 通过脚本播放动画 Motion Controller 学习使用
  18. ROSbag解压图片
  19. 基于POI的wod模板文件,导入参数,导出最终文件
  20. SQL语句的一个面试题目

热门文章

  1. mysql服务启动失败(Aborting)
  2. (数据结构)二叉树的顺序存储结构
  3. VS2019MFC进行无预览简单绘图:直线,画笔,画刷,矩形,椭圆
  4. 4月刊独家专访:Visual Studio 2010 是怎样炼成的
  5. VritualBox Centos 与主机复制粘贴问题解决
  6. layui隐藏表格中的某一列
  7. 详解Liunx中less命令:查看日志,搜索关键字
  8. 基于 gma 绘制古代洛阳 5 大都城遗址空间分布地图
  9. 2019 认知改变与提升
  10. flask 框架简介