Android Studio的NDK开发环境搭建

目标

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

    配置要求

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

  • gradle2.5 以上
  • Android Studio的NDK开发环境搭建_第1张图片
  • android-ndk-r10以上
  • Android Studio的NDK开发环境搭建_第2张图片
  • 如果配置一个过高一个过低容易出现兼容性问题

    如何下载

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

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

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

  • 新建一个AS工程,注意新建的时候这里写图片描述
  • 要把include C++ Support勾选上,这样就说明新建一个jni项目。
  • 再看目录结构:
  • Android Studio的NDK开发环境搭建_第4张图片
  • 看目录结构 会发多了三个文件夹
  • 第一个 .externNativeBuild :Android Studio的NDK开发环境搭建_第5张图片
  • 这里会决定如何编译,即编译的规则,等会重点讲android_gradle_build.json文件
  • 第二个文件:cpp文件Android Studio的NDK开发环境搭建_第6张图片
  • 这个文件里面本来只有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.cpp

add_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中可以用.来拉出来提示,而不是用—>,不过.完之后还是生成—>的标志。

你可能感兴趣的:(Android,NDK开发)