Android Studio的NDK开发环境搭建

来源:互联网 发布:linux配置nfs 编辑:程序博客网 时间:2024/03/29 22:54

目标

  • 由于要涉及到音视频的开发,所以要用到JNI,之前一直用AS2.0的,发现用这个做NDK开发太麻烦了,后来看到动脑学院老师的一个教学视频,android studio的NDK开发配置,做了一个学习笔记,视频可以百度搜索的到。

    配置要求

  • Android Studio 2.2以上(因为在2.2以上更好的兼容了ndk开发)

  • gradle2.5 以上
  • 这里写图片描述
  • android-ndk-r10以上
  • 这里写图片描述
  • 如果配置一个过高一个过低容易出现兼容性问题

    如何下载

  • Android的工具下载网站:http://www.androiddevtools.cn/

  • Android studio 的下载工具:http://www.android-studio.org/
  • 我是直接用了green vpn,然后在这里写图片描述
  • help-chack for update里面可以更新,他会检查AS本身的版本和SDK和其他工具的一些跟新的,如果能翻墙的话基本更新这里就OK的,注意:更新的AS的版本会提供一个最新的稳定版本的(我更新的时候是2.2.3的-2017-01-13)。

Android Studio的目录结构(include C++ support)

  • 新建一个AS工程,注意新建的时候这里写图片描述
  • 要把include C++ Support勾选上,这样就说明新建一个jni项目。
  • 再看目录结构:
  • 这里写图片描述
  • 看目录结构 会发多了三个文件夹
  • 第一个 .externNativeBuild :这里写图片描述
  • 这里会决定如何编译,即编译的规则,等会重点讲android_gradle_build.json文件
  • 第二个文件:cpp文件这里写图片描述
  • 这个文件里面本来只有native-lib.cpp,但是由于AS本身问题,如果只有一个cpp文件的话容易报错,所以一般都先建立一个空的cpp文件。
  • 第三个文件:CMakeList.txt,决定了编译的内容。等于是第一个文件中那个.json的入口的。

CMakeList.txt 分析

  • 这里是我建立的HelloJNI的这个文件的
# cmake 是跨平台的一个命令,这个命令是在linux环境下也有,主要编译一些C/C++cmake_minimum_required(VERSION 3.4.1)#这句话 就是cmake的版本号最低要3.4.1  有可能githup上的版本号要低于我现在的最低版本# add_library:这里是代表增加一个.so动态库,包含的文件为    src/main/cpp/native-lib.cpp  和src/main/cpp/demo.cppadd_library( # Sets the name of the library.             native-lib> 设置 .so 的名称  运行后在app根目录下有> \build\intermediates\cmake\debug\obj\armeabi\libnative-lib.so的生成,这个生成路径由上面.json的output的路径来决定,跟视频中的不一样             # Sets the library as a shared library.             SHARED               1-如果加了一个demo.cpp               2-需要在这下面加一个.cpp             src/main/cpp/native-lib.cpp                 src/main/cpp/demo.cpp             # 编译的源文件的目录                         )# 这时候注意,如果你想生成两个.so文件,那么就要再次的add_library一下,内容由自己来添加#连接动态的预编译库find_library( # Sets the name of the path variable.                #打印日志的so库              log-lib              # Specifies the name of the NDK library that              # you want CMake to locate.              log )target_link_libraries( # Specifies the target library.                       native-lib                       # Links the target library to the log library                       # included in the NDK.                       ${log-lib} )

android_gradle_build.json ###

  • 这个文件是一个json格式的文件,他是有CMakeList.txt来决定是什么样的。真正入口是在build.gradle中过的android{
    在这里面有一句这样的代码: externalNativeBuild {
    cmake {
    path “CMakeLists.txt”
    }
    }
    这就决定开始运行cmake命令,然后就生成了json格式的上面的语句
    }
{    "buildFiles" : [ 。。。],    "cleanCommands" :     [        " 。。。"    ],    "cppFileExtensions" : [ "cpp" ],    "libraries" :     {        "demo-Debug-arm64-v8a" :         {            "abi" : "arm64-v8a",            "artifactName" : "demo",            "buildCommand" : " 。。。",            "buildType" : "debug",            "files" :             [                {                    "flags" : "  。。。",                    "src" : " 。。。demo.cpp",                    "workingDirectory" : " 。arm64-v8a"                }            ],            "output" : " build/intermediates/cmake/debug/obj/arm64-v8a/libdemo.so",            "toolchain" : "1057882217"        },        "native-lib-Debug-arm64-v8a" :         {            "abi" : "arm64-v8a",            "artifactName" : "native-lib",            "buildCommand" : " 。。。",            "buildType" : "debug",            "files" :             [                {                    "flags" : "  。。。",                    "src" : " 。。。native-lib.cpp",                    "workingDirectory" : " 。。。externalNativeBuild/cmake/debug/arm64-v8a"                }            ],            "output" : " 。。。build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so",            "toolchain" : "1057882217"        }    },    "toolchains" :     {        "1057882217" :         {            "cCompilerExecutable" : "E:/LycHy/android-ndk-r13b/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe",            "cppCompilerExecutable" : "E:/LycHy/android-ndk-r13b/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe"        }    }}
  • 这里面的话可清晰的看出整个框架,这里我是生成了两个.so的库所以在”libraries” : {这个大括号里面有两个artifactName}
  • 在artifactName中flags就代表编译这个CPP的平台方式等等,比如demo这里面有include

要注意的地方

  • 在源文件.cpp 中,要在代码最外层,除了include下面加上 extern “C”{这个是最外层}
  • 在java中可以自动去生成,然后在cpp中可以用.来拉出来提示,而不是用—>,不过.完之后还是生成—>的标志。
0 0
原创粉丝点击