Android Studio的NDK開發環境搭建
阿新 • • 發佈:2019-02-09
目標
由於要涉及到音視訊的開發,所以要用到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中可以用.來拉出來提示,而不是用—>,不過.完之後還是生成—>的標誌。