android studio中編譯C/C++源代碼
1. 配置ndk.dir
在 local.properties 添加如下配置:
sdk.dir=path_of_android-sdk
ndk.dir=path_of_android-ndk
android studio中有對ndk環(huán)境的設(shè)置:
【File】->[Project Struct]->Android NDK Location
在如上位置設(shè)置ndk的安裝位置。
2.Gradle配置NDK模塊
參考如下:
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "com.frank.smart.smarthome"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk {
moduleName "SmartSocket"
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
}
ndk還可以配置更多選項(xiàng)蕊梧,如下:
ndk {
moduleName "myEpicGameCode"
cFlags "-DANDROID_NDK -D_DEBUG DNULL=0" // Define some macros
ldLibs "EGL", "GLESv3", "dl", "log" // Link with these libraries!
stl "stlport_shared" // Use shared stlport library
}
3.添加C/C++源代碼
默認(rèn)情況下算行,你需要把C/C++源代碼放在 [module]/src/main/jni/ 路徑下掉盅。效果如下圖所示:
當(dāng)然,你也可以自定義源代碼路徑:
android {
// .. android settings ..
sourceSets.main {
jni.srcDirs 'src/main/source'
}
}
4.分平臺配置編譯(可選)
這一步不是必須的繁涂,你可以根據(jù)需要帅戒,對各個平臺進(jìn)行不同的編譯配置昙读,可以設(shè)置覆蓋前面的編譯選項(xiàng)(例如 cFlags )乌逐。例如你只想編譯指定平臺的.so竭讳,而不是所有的平臺。如下:
android {
// .. android settings ..
productFlavors {
x86 {
ndk {
abiFilter "x86"
}
}
arm {
ndk {
abiFilter "armeabi-v7a"
}
}
mips {
ndk {
abiFilter "mips"
}
}
}
} // android
5. 一個編譯錯誤的解決
android studio 根據(jù)Gradle配置自動生成Android.mk 位于app\build\intermediates\ndk\debug下
如果只有c/cpp文件黔帕,直接這樣編譯的話代咸,會報錯蹈丸,這應(yīng)該是android studio 在這種情況自動生成Android.mk 時的一個bug成黄,見編譯錯誤。
Error:Execution failed for task ':nativeactivity:compileDebugNdk'.
com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'D:\android-ndk-r10\ndk-build.cmd'' finished with non-zero exit value 2
解決方法:
在jni文件下建一個空的empty.c文件 編譯運(yùn)行即可
如果還運(yùn)行不了逻杖,在當(dāng)前model的build.gradle下添加
android{
…………
sourceSets.main {
jni.srcDirs = []
}
}