1. 程式人生 > >Android Studio的NDK開發環境搭建

Android Studio的NDK開發環境搭建

目標

  • 由於要涉及到音視訊的開發,所以要用到JNI,之前一直用AS2.0的,發現用這個做NDK開發太麻煩了,後來看到動腦學院老師的一個教學視訊,android studio的NDK開發配置,做了一個學習筆記,視訊可以百度搜索的到。

    配置要求

  • Android Studio 2.2以上(因為在2.2以上更好的相容了ndk開發)

  • gradle2.5 以上
  • 這裡寫圖片描述
  • android-ndk-r10以上
  • 這裡寫圖片描述
  • 如果配置一個過高一個過低容易出現相容性問題

    如何下載

  • 我是直接用了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.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中可以用.來拉出來提示,而不是用—>,不過.完之後還是生成—>的標誌。