(NDK编译)详解使用Android.mk编译的C/C++程序过程

这篇具有很好参考价值的文章主要介绍了(NDK编译)详解使用Android.mk编译的C/C++程序过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

想要在Android设备上运行C/C++程序可执行文件,可采用一个方法就是使用NDK编译,很多时候要比gcc编译更适合,这里我采用的是imx6q开发板上面装载了自己编写的Android6.0.1镜像,在Ubuntu64位系统上采用NDK编译。

目录

1.准备文件

2.编写Android.mk

注意

完整Android.mk代码

3.NDK编译

4.运行可执行文件


1.准备文件

首先在新建的一个文件夹中,放置自己编写的两个文件,一个是C语言程序,一个是Android.mk,C语言程序内容可以由自己决定,符合标准即可。也可以是最简单的打印hello,world

ndk编译,嵌入式开发,Android开发,android,adb,c++,c语言,开发语言

2.编写Android.mk

对于Android.mk文件的编写,需要先了解其中一些必要的设置,这里我先放出我的Android.mk 

ndk编译,嵌入式开发,Android开发,android,adb,c++,c语言,开发语言

文件内容很简短,来详细解释一下,

LOCAL_PATH := $(call my-dir)

首先必须定义好LOCAL_PATH变量,用于在开发树中查找源文件。宏函数my-dir由编译系统提供,用于返回当前路径(即包含Android.mk文件的目录)。

include $(CLEAR_VARS)

这是必要的语句,CLEAR_VARS由编译系统提供,用于清除许多LOCAL_XXX变量,如: LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES...

LOCAL_MODULE := test_app

编译的目标对象,LOCAL_MODULE变量必须定义,以标识在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。编译系统会自动产生合适的前缀和后缀,一个被命名为'sum'的共享库模块,将会生成'libsum.so'文件。

LOCAL_SRC_FILES := test_app.c

LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。我们不需要在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件,仅仅列出直接传递给编译器的源代码文件就好。

include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY表示编译生成共享库,是编译系统提供的变量,指向一个GNU Makefile脚本,负责收集自从上次调用'include $(CLEAR_VARS)'以来,定义在LOCAL_XXX变量中的所有信息,并且决定编译什么,如何正确地去做

注意

可以看到我的Android.mk文件当中还有两行

LOCAL_CFLAGS += -pie -fPIE 
LOCAL_LDFLAGS += -pie -fPIE

在起初我没有添加这两行代码时,也可使用NDK成功编译出可执行文件,但放在Android系统的开发板上时无法运行并报错:only position independent executables (PIE) are supported

ndk编译,嵌入式开发,Android开发,android,adb,c++,c语言,开发语言

我通过参考error: only position independent executables (PIE) are supported 了解了这个问题以及解决办法,大体上就是从Android4.1引入了PIE这个安全机制,解决办法就是加入上述的两条语句在Android.mk文件中即可

完整Android.mk代码

给出完整的Android.mk代码,由于我的C文件叫做test_app.c,所以想要直接使用需要把下面代码中test_app换为自己电脑上C程序文件的名称即可。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)


LOCAL_SRC_FILES := test_app.c
LOCAL_MODULE := test_app

LOCAL_CFLAGS += -pie -fPIE 
LOCAL_LDFLAGS += -pie -fPIE

include $(BUILD_EXECUTABLE)

#APP_ALLOW_MISSING_DEPS=true

#APP_PLATFORM        := android-14
APP_ABI             := armeabi-v7a x86 x86_64 arm64-v8a

3.NDK编译

完成上述步骤后,在当前文件夹下打开终端,输入ndk-build的命令进行编译

/home/yinlong/Music/sdkapp/android-ndk-r14b-linux-x86_64/android-ndk-r14b/ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk

ndk编译,嵌入式开发,Android开发,android,adb,c++,c语言,开发语言

成功编译后,在当前目录下出现了两个新的文件夹,生成的可执行程序都放在libs目录下

ndk编译,嵌入式开发,Android开发,android,adb,c++,c语言,开发语言

 libs目录下可以看到有多个版本,适合我的imx6q开发板的是armeabi-v7a下的程序

ndk编译,嵌入式开发,Android开发,android,adb,c++,c语言,开发语言

打开后可以看到编译好的test_app

ndk编译,嵌入式开发,Android开发,android,adb,c++,c语言,开发语言

4.运行可执行文件

把上面的文件放到Android设备中,也就是放入我的开发板中运行下面命令设置文件的读写权限,注意是要在有root权限的情况下

chmod 777 test_app

接着就可以运行NDK编译的可执行文件了 

./test_app

ndk编译,嵌入式开发,Android开发,android,adb,c++,c语言,开发语言文章来源地址https://www.toymoban.com/news/detail-754751.html

到了这里,关于(NDK编译)详解使用Android.mk编译的C/C++程序过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Clion配置C++程序用Android NDK编译,并用真机远程调试(临时目录和termux)

    :ndk, clion, cmake, usb, tcp, ssh, remote debug, remote gdb debug, termux, tabby 假设已经有了一个在windows下能正常编译运行的C++控制台程序,本文仅说明如何在windows下交叉编译到android并调试。C++库类似。 要点提示: 对于unity用户,建议用unity 2022自带的 ndk r23 。理论上可以用新版,但

    2024年02月21日
    浏览(55)
  • Android NDK开发详解之使用预构建库

    NDK 支持使用预构建库(同时支持静态库和共享库)。此功能有以下两个主要用例: 本页将介绍如何使用预构建库。 声明预构建库 您必须将自己使用的每个预构建库声明为一个独立模块。为此,请执行以下步骤: 下面这个简单的示例假设预构建库 libfoo.so 与描述它的 Android

    2024年02月06日
    浏览(46)
  • 在Clion开发工具上使用NDK编译可以在安卓上执行的程序

            因为工作需要,我要将一份C语言代码编译成可执行文件传送到某安卓系统里执行。         众所周知,使用ndk编译代码有三种使用方式,分别是基于 Make 的 ndk-build、CMake以及独立工具链。以前进行ndk编程都是使用ndk-build进行的,新建jni目录,编写Android.mk和A

    2023年04月12日
    浏览(35)
  • Android JNI系列详解之ndk-build工具的使用

    一、Android项目中使用ndk-build工具编译库文件 之前介绍过CMake编译工具的使用,今天介绍一种ndk自带的编译工具ndk-build的使用。 ndk-build目前主要有两种配置使用方式:  如上图所示,第一种方式是Android.mk+Application.mk+gradle的方式生成库文件;第二种方式是Android.mk+Application.mk+命

    2024年02月10日
    浏览(34)
  • android ndk一些编译链接错误及解决办法

    链接opencv库时报链接错误缺少libz库 解决,mediann是本人所编译库的名字 链接librknnrt.so时报 解决 使用的是aarch-linux的库,报错换成android版本的librknnrt.so即可 链接opencv库时报错缺少jnigraphics 解决 链接opencv库时报错确实mediandk 解决 链接opencv时报很多std的链接错误 解决 ndk版本太

    2024年02月09日
    浏览(48)
  • Android-NDK的linux交叉编译环境

    NDK 下载  |  Android NDK  |  Android Developers https://github.com/android/ndk/wiki/Unsupported-Downloads 以android-ndk-r26c下载为例,下载后将压缩包解压至/usr目录下 编译平台变量判断条件中增加一下android条件下CMake的变量 详细变量设置参考 C++ 库支持  |  Android NDK  |  Android Developers 编译出的程

    2024年04月10日
    浏览(42)
  • Android NDK开发详解之ndk-build 脚本

    ndk-build 脚本使用 NDK 的基于 Make 的构建系统构建项目。我们针对 ndk-build 使用的 Android.mk 和 Application.mk 配置提供了更具体的文档。 内部原理 运行 ndk-build 脚本相当于运行以下命令: $GNUMAKE 指向 GNU Make 3.81 或更高版本, 则指向 NDK 安装目录。您可以根据这些信息从其他 Shell 脚

    2024年02月06日
    浏览(41)
  • android ndk clang交叉编译ffmpeg动态库踩坑

    1.ffmpeg默认使用gcc编译,在android上无法使用,否则各种报错,所以要用ndk的clang编译 2.下载ffmpeg源码 修改configure文件,增加命令 cross_prefix_clang 修改以下命令 修改后 3.新建脚本文件,ffmpeg目录下执行脚本文件即可。 编译32位,则ARCH改为arm,CPU改为armv7-a,TARGET改为armv7a-linux-

    2024年02月13日
    浏览(45)
  • NDK编译C++源码生成Android平台so文件(opencv_android)

     1.准备CPP文件  编写CMakeLists.txt 编写 mk文件   android-8 is unsupported. Using minimum supported version android-16  APP_PLATFORM android-16 is higher than android:minSdkVersion 1 in ./AndroidManifest.xml 修改Application.mk中的APP_PLATFORM为 android-21  builg.gradle添加原生编译路径     出现gnustl_static不支持错误  修改

    2024年02月10日
    浏览(41)
  • [Android AIDL系列 1] 手动编译aidl文件,生成Java、C++[android]、C++[ndk]、Rust接口

    AIDL文件在Android系统上应用广泛,和底层的Binder机制紧密关联。 在Android源码或者Android Studio中通常是自动编译aidl文件,生成对应语言的接口文件。 做应用层Java开发,aidl和binder封装的比较“干净”,不用太多的涉及binder的调用细节,也不用太关心aidl的编译过程。 如果是做中

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包