androidstudio中的ndk开发环境搭建

1.ndk(Native Development Kit) 概念

NDK包括了

  • 从C / C++生成原生代码库所需要的工具和build files。
  • 将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages files ,即.apk文件)中。
  • 支持所有未来Android平台的一系列原生系统头文件和库

为何要用到NDK?

  • 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库被反编译的难度较大。
  • 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。
  • 便于移植,用C/C++写的库可以方便在其他的嵌入式平台上再次使用。

2.android studio项目中c++代码添加和调试

  1. 下载必要组件

    • Android 原生开发工具包 (NDK):这套工具集允许您为 Android 使用 C 和 C++ 代码,并提供众多平台库,让您可以管理原生 Activity 和访问物理设备组件,例如传感器和触摸输入。
    • CMake:一款外部构建工具,可与 Gradle 搭配使用来构建原生库。如果您只计划使用 ndk-build,则不需要此组件。
    • LLDB:一种调试程序,Android Studio 使用它来调试c++代码,可以在调试断点处查看/更改变量值、执行函数等等。

    可以通过sdk manager来下载这些组件。

    下载必要组件截图
  2. 创建支持c++的项目

    创建项目时勾选include c++ support

    勾选c++ support

    然后next到Customize C++ Support配置c++选项

    配置c++选项

    ​c++选项释义如下:

    • C++ Standard:使用下拉列表选择您希望使用哪种 C++ 标准。选择 Toolchain Default 会使用默认的 CMake 设置。
    • Exceptions Support:如果您希望启用对 C++ 异常处理的支持,请选中此复选框。如果启用此复选框,Android Studio 会将 -fexceptions 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。
    • Runtime Type Information Support:如果您希望支持 RTTI,请选中此复选框。如果启用此复选框,Android Studio 会将 -frtti 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。
  3. 配置和组建项目

创建项目完成后会默认在app moudle根目录下创建CMakeList.txt,c++代码默认放在src-main-cpp目录下。可以在app的build-gradle中指定cmake的执行文件路径、过滤生成的abi种类等。可以通过CMakeList.txt定义原生库文件的依赖、输出so文件路径/名称等。值得注意的是有一些变量在cmake官方库中未定义,这些变量是在android.toolchain.cmake中的,例如ANDROID_ABI变量。studio 的Instant Run与使用原生代码的项目不兼容。Android Studio 会自动停用原生项目的此功能。

  • 指定ABI:

默认情况下,Gradle 会针对 NDK 支持的 ABI将您的原生库构建到单独的 .so 文件中,并将其全部打包到您的 APK 中。如果您希望 Gradle 仅构建和打包原生库的特定 ABI 配置,您可以在模块级 build.gradle 文件中使用 ndk.abiFilters 标志指定这些配置,如下所示:

android {
  ...
  defaultConfig {
    ...
    ndk {
      // Specifies the ABI configurations of your native
      // libraries Gradle should build and package with your APK.
      abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a',
                   'arm64-v8a'
    }
  }
  buildTypes {...}
  externalNativeBuild {...}
}

官网上说:

在大多数情况下,您只需要在 ndk {} 块中指定 abiFilters(如上所示),因为它会指示 Gradle 构建和打包原生库的这些版本。不过,如果您希望控制 Gradle 应当构建的配置,并独立于您希望其打包到 APK 中的配置,请在 defaultConfig.externalNativeBuild.cmake {} 块配置另一个 abiFilters 标志。

实际测试两者效果并没有什么差别,都会控制库文件输出以及apk的.so文件架构平台。tips:使用 Build > Analyze APK可以查看apk包含的原生.so文件。

  • cmake更改输出库目录:

cmake文件不展开说明了,此处为更改输出so路径为项目根目录的libss目录下:

其中设置CMAKE_LIBRARY_OUTPUT_DIRECTORY方式需要在add_library之前设置,set_target_properties方式需要在add_library之后设置,设置LIBRARY_OUTPUT_PATH的方式实际测验无效。

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../libss/${ANDROID_ABI})
# Old library location variable。老版本的变量,cmake官网虽然没有说明,实际测试已经无法工作了
#set(LIBRARY_OUTPUT_PATH  ${PROJECT_SOURCE_DIR}/../libss/${ANDROID_ABI})
add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/native-lib.cpp )

#自定义target目录,可以设置特定名字target的属性,也可以直接更改默认的所有target的输出路径,文件夹不存在会自动创建。
#set_target_properties(native-lib PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../libss/${ANDROID_ABI} )

  • 运行构建:

执行build—>make moudle app

小结:

android studio2.2起开始c++代码可以直接在studio中编写打包入apk了,studio默认使用cmake进行构建原生库,cmake所做的其实是生成MakeFiles然后再调用ndk-build生成.so文件。cmake可以指定toolchain来生成android平台的库,如果不指定默认生成对应平台的库,windows下是.dll文件,mac下是.dylib文件,studio中默认使用的是sdk下的cmake下的android.toolchain.cmake工具链文件来生成so文件。本地的android.toolchain.cmake文件路径可以在app-.externalNativeBuild-debug-cmake_build_command.txt中查看,默认路径是:/Users/mac02/Library/Android/sdk/cmake/3.6.4111459/android.toolchain.cmake

谷歌最新的android.toolchain.cmake

CMakeList.txt命令的官方说明文档

添加c++代码studio官方教程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容