如何在Android Studio中构建sipdroid?

时间:2015-11-21 15:59:53

标签: android android-ndk

我从here下载了sipdroid项目,并尝试在Android Studio中导入。在构建错误时:

  

错误:当前插件中不推荐使用NDK集成。考虑尝试新的实验插件。有关详细信息,请参阅http://tools.android.com/tech-docs/new-build-system/gradle-experimental。在gradle.properties中设置“android.useDeprecatedNdk = true”以继续使用当前的NDK集成。

我创建了名为gradle.properties的文件,并添加了android.useDeprecatedNdk=true

然后在构建时我遇到包含libs的错误,例如:

#include <myinttypes.h>
#include <spandsp/telephony.h>
#include <spandsp/g722.h>
#include <spandsp/private/g722.h>

还有一个错误:

  

错误:任务':app:compileDebugNdk'执行失败   com.android.ide.common.process.ProcessException:org.gradle.process.internal.ExecException:进程'命令'C:\ Users .... \ ndk-bundle \ ndk-build.cmd''以非完成零退出值2

怎么了?如何在没有这个错误的情况下构建项目?

1 个答案:

答案 0 :(得分:2)

首先,您始终可以使用命令行构建jni-part,这样做:

android.useDeprecatedNdk=true

并使用

创建gradle.properties文件
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'
}

项目的根源。

使用新的 build.gradle (模块:应用)将是:

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")
    }
}

它适用于我。

通常我会使用Experimental Android Gradle Plugin,它对本机项目来说要好得多。将 sipdroid 导入Android Studio后,您需要将 build.gradle (模块:应用)更改为:

 'com.android.tools.build:gradle:1.5.0'

并从

更改build.gradle(整个项目,根目录)中的类路径
'com.android.tools.build:gradle-experimental:0.4.0'

#include "SKP_Silk_typedef.h"

并在项目的根目录中删除带有'android.useDeprecatedNdk = true'的gradle.properties文件。

构建完成后,Android Studio将消除 Gradle Build Messages 包含来源的大量错误,并通过点击相应的消息找到它们。

我没有看到使用Experimental Android Gradle Plugin的任何其他变体,而不是像这样更改cpp和c文件中的包含:

例如在 ndk / silk / src / SKP_Silk_main_FIX.h

#include "../interface/SKP_Silk_typedef.h"

android.sources {
    main {
        jni {
            source {
                srcDirs = []
            }
        }
    }
}

很遗憾这个片段与Gradle Experimental Plugin同步,但没有效果。

android.sources{
    main.jni {
        source {
            srcDirs = []
        }
    }
    main.jniLibs {
        source {
            srcDirs = ['src/main/libs']
        }
    }
}

有解决方案来自 How to use custom Android.mk with new gradle build system

BError:Attempt to read a write only view of model of type 'java.lang.Object' given to rule 'model.android.sources'

插件 gradle-experimental中的 bug :0.4.0 会抛出此错误

{{1}}

gradle-experimental:0.3.0-alpha7 如果删除 jni 并且仅保存 libs 目录,则可正常工作。