iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >详解Android studio ndk配置cmake开发native C
  • 344
分享到

详解Android studio ndk配置cmake开发native C

androidstudiondk 2023-05-30 20:05:10 344人浏览 独家记忆
摘要

Android 2.2 以后的版本对NDK的支持已经非常好了。最近把一个纯C的android项目,从eclipse ADT迁移到Android studio上。本文是参考Add C and c++ Code to Your Project

Android 2.2 以后的版本对NDK的支持已经非常好了。最近把一个纯C的android项目,从eclipse ADT迁移到Android studio上。本文是参考Add C and c++ Code to Your Project 官方文档(需要翻墙),经过各种尝试之后的总结

Android studio整合NDK开发,有两种模式,一种是ndk build,一种是cmake,如果是新项目官方推荐cmake。原来,ADT的时候只能用ndk build,这次切换IDE并没有选用ndk build,而是尝试了cmake感觉上配置更加简洁方便。

本文探讨一下几点:

迁移现有native C代码使用cmake,如果是新项目同理更加简单。
2. 项目是native activity就是没有java代码的纯native project。
3. 构建编译出多个so文件,并有依赖关系。
4. 使用不依赖IDE目录结构的代码目录。
5. 创建过程中的注意事项。

创建native项目,可以有两个选项。第一个是创建的时候,选择带有C++ Support功能的。

详解Android studio ndk配置cmake开发native C

第二个是对已有工程添加C/C++功能。这里,无论是不是新项目,都推荐使用创建一个项目在添加c/c++功能,这样native code就可以独立于项目放在任意目录。创建一个没有native code工程,在根据CMakeLists.txt文件来添加NDK的支持。File -> Link C++ Project with Gradle。

详解Android studio ndk配置cmake开发native C

这样,我们的代码就可以独立于IDE的目录结构。只要提供CMakeLists.txt文件即可。一旦我们提供了CMakeLists.txt文件,Android studio就会根据这个文件为我们在工程下面生成一个cpp文件夹用来存放CMakeLists.txt里面配置的native代码文件。

详解Android studio ndk配置cmake开发native C

下面我们来快速的介绍一下CMakeLists.txt基本功能的写法,能够应付通常的情况。更多丰富的使用规则需要查看官方文档。CMake documentation。

# Sets the minimum version of CMake required to build the native # library. You should either keep the default value or only pass a # value of 3.4.0 or lower.  cmake_minimum_required(VERSION 3.4.1)  #####################################################################  # 这个是设置了编译C的参数,这里使用C99并开启三级优化 # 类似的设置还有CMAKE_CPP_FLAGS就是设置编译C++的参数 # 更多的参数就要根据需要看文档了 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -std=c99")  #####################################################################  # 这个函数是用来编译库的,主要是so文件和a文件。 add_library( # 括号不在这一行语法错误   # 库的名字自定义的   PNG       # static 就是a文件,shared 就是so文件    STATIC      # 这里提供的是预编译好的文件,所以用这个imported,   # 否则需要提供需要编译文件的列表   IMPORTED  )  # 设置编译库文件的属性,有很多属性设置,根据需要查看文档 set_target_properties(   # 设置哪个库的编译属性   PNG            # 上面的PNG库是预编译的,这里的属性表示文件所在的位置   PROPERTIES IMPORTED_LOCATION                     # 提供预编译文件的位置。   # CMAKE_SOURCE_DIR 是内置变量表示当前CMakeLists.txt的位置。   # 这里需要提供绝对路径所以需要这个变量,   # 下面会看到所有的设置都是相对于当前文件的。但这个设置需要绝对路径。   # ANDROID_ABI内置变量,会根据当前编译的平台分配一个文件夹名字,   # 比如armeabi-v7a, armeabi,x86等等   ${CMAKE_SOURCE_DIR}/PNG/Prebuilt/Android/${ANDROID_ABI}/libpng.a )  #####################################################################  # 表示编译文件时候,头文件的位置。路径是相对于当前文件的 # 正确设置了这个路径,在IDE中代码头文件也会正确索引。否则会无法定位头文件。 # 这里我们提供了代码的文件的根目录和PNG库的头文件目录 include_directories(   ../../../   ../../External/PNG/Include/Android/ )  # 另外一个用法。编译so文件,自定义名字叫做NativeLib # 就像NDK Build的配置一样,需要把源文件列表提供,不需要头文件。 # 这些源文件会编译成一个NativeLib.so文件。 # 值得一提的时候,在NDK Build中,我编译一个没有源文件的so文件, # 以后把其他的a文件整体连接进来。这里不行,必须提供源文件至少一个。 add_library(   NativeLib SHARED    ../../Toolkit/Toolkit.c   ../../Toolkit/Math/Math.c   ../../Toolkit/Math/Matrix.c   ../../Toolkit/Math/TweenEase.c   ../../Toolkit/Utils/Array.c   ../../Toolkit/Utils/ArrayList.c   ../../Toolkit/Utils/ArrayStrMap.c   ../../Toolkit/Utils/ArrayIntMap.c   ../../Toolkit/Utils/ArrayQueue.c   ../../Toolkit/Utils/BufferReader.c   ../../Toolkit/Utils/JSON.c   ../../Toolkit/Utils/Tween.c   ../../Toolkit/Utils/TweenTool.c   ../../Toolkit/PlatfORM/File.c )  # 这是编译一个a文件。可见此函数可以使用任意多个,编译出多个库文件。 add_library(   EntryLink STATIC   ../../Application/EntryLink.c )  # 这是连接一个库文件。在库文件使用了平台,或是预编译库的接口文件,就需要在此连接。 # 才能在运行时正确调用到这些接口函数。 target_link_libraries(   # 需要连接的库名字,上面定义的任何一个库都行。   NativeLib      # 这里奇怪的参数,是让PNG这个库直接拷贝到NativeLib里面。   # 因为并不打算把PNG这个库单独载入,平台也不一定有这个库,   # 于是就整体复制到NativeLib.so里面   "-Wl,--whole-arcHive"     PNG     "-Wl,--no-whole-archive"        # 这个库存在的意义是   # 比如我在NativeLib用到了一些接口函数,希望留给另外一个库使用。   # 连接的时候,不提供另外一个库,或是那个库还没编译。就会连接失败找不到函数实现。   # 所以我们用这个库实现空的函数,用作连接。   # 并不会放到NativeLib.so里。真正运行的时候,有别的so库文件提供。   EntryLink      # 以下就是Android平台提供的库直接写名字就行了。官方文档有说明哪些。   android          EGL     GLESv2     log     z ) 

--结束END--

本文标题: 详解Android studio ndk配置cmake开发native C

本文链接: https://www.lsjlt.com/news/220879.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作