【问题标题】:How to build sipdroid in Android Studio?如何在 Android Studio 中构建 sipdroid?
【发布时间】:2016-02-24 01:12:51
【问题描述】:

我从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

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

#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: Process 'command 'C:\Users....\ndk-bundle\ndk-build.cmd'' 以非完成零退出值 2

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

【问题讨论】:

  • 如果您想使用一个复杂的软件,您可能必须遵循其开发人员使用的现有构建流程,或者投入大量时间来创建一个新的了解现有的。您不能只是盲目地将此类项目导入 IDE 并期望它们能够构建。

标签: android android-ndk


【解决方案1】:

一开始,你总是可以用命令行构建 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 目录,则效果很好。

【讨论】:

  • 为什么不使用cppFlags.add("-I../interface")
  • 这是个好主意,我们可以为 Android.mk 中的所有目录添加该标志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 2013-11-06
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
相关资源
最近更新 更多