一开始,你总是可以用命令行构建 jni-part,这样做:
$ export NDK_PROJECT_PATH=/opt/umake/AndroidStudioProjects/Sipdroid/app/src/main
$ /opt/umake/android/android-ndk/ndk-build
并使用
创建 gradle.properties 文件
android.useDeprecatedNdk=true
在项目的根目录。
加上新的build.gradle(模块:app)将是这样的:
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.0.1"
defaultConfig {
applicationId "org.sipdroid.sipua"
minSdkVersion 5
targetSdkVersion 21
ndk {
moduleName "OSNetworkSystem"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
sourceSets.main.jni.srcDirs = [] // disable automatic ndk-build call, which ignore our Android.mk
sourceSets.main.jniLibs.srcDir 'src/main/libs'
}
它对我有用。
通常我使用 Experimental Android Gradle Plugin,它更适合原生项目。将 sipdroid 导入 Android Studio 后,您需要将 build.gradle (Module: app) 更改为:
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 21
buildToolsVersion = "21.0.1"
defaultConfig.with {
applicationId = "org.sipdroid.sipua"
minSdkVersion.apiLevel = 10
targetSdkVersion.apiLevel = 21
}
}
compileOptions.with {
sourceCompatibility=JavaVersion.VERSION_1_7
targetCompatibility=JavaVersion.VERSION_1_7
}
/*
* native build settings
*/
android.ndk {
moduleName = "OSNetworkSystem"
/*
* Other ndk flags configurable here are
* cppFlags.add("-fno-rtti")
* cppFlags.add("-fno-exceptions")
* ldLibs.addAll(["android", "log"])
* stl = "system"
*/
}
android.buildTypes {
release {
minifyEnabled = false
proguardFiles.add(file('proguard-rules.txt'))
}
}
android.productFlavors {
// for detailed abiFilter descriptions, refer to "Supported ABIs" @
// https://developer.android.com/ndk/guides/abis.html#sa
create("arm") {
ndk.abiFilters.add("armeabi")
}
create("arm7") {
ndk.abiFilters.add("armeabi-v7a")
}
create("arm8") {
ndk.abiFilters.add("arm64-v8a")
}
create("x86") {
ndk.abiFilters.add("x86")
}
create("x86-64") {
ndk.abiFilters.add("x86_64")
}
create("mips") {
ndk.abiFilters.add("mips")
}
create("mips-64") {
ndk.abiFilters.add("mips64")
}
// To include all cpu architectures, leaves abiFilters empty
create("all")
}
}
并从
更改 build.gradle(整个项目,根目录)中的类路径
'com.android.tools.build:gradle:1.5.0'
到
'com.android.tools.build:gradle-experimental:0.4.0'
并删除项目根目录中带有 'android.useDeprecatedNdk=true' 的 gradle.properties 文件。
构建后,Android Studio 将使用 Gradle Build Messages 消除源中包含包含的大量错误,并通过单击相应消息来定位它们。
我没有看到任何其他带有实验性 Android Gradle 插件的变体,而不是像这样更改 cpp 和 c 文件中的包含:
如ndk/silk/src/SKP_Silk_main_FIX.h:
#include "SKP_Silk_typedef.h"
到
#include "../interface/SKP_Silk_typedef.h"
很遗憾,这个片段与 Gradle Experimental Plugin 同步,但是没有效果。
android.sources {
main {
jni {
source {
srcDirs = []
}
}
}
}
有解决办法
How to use custom Android.mk with new gradle build system
android.sources{
main.jni {
source {
srcDirs = []
}
}
main.jniLibs {
source {
srcDirs = ['src/main/libs']
}
}
}
似乎插件 gradle-experimental:0.4.0 中的一个 bug 引发了这个错误
BError:Attempt to read a write only view of model of type 'java.lang.Object' given to rule 'model.android.sources'
但 gradle-experimental:0.3.0-alpha7 如果删除 jni 并仅保存 libs 目录,则效果很好。