1

尝试在 Android Studio ( https://github.com/DrKLO/Telegram ) 中构建 Telegram 源代码时遇到问题。

我已经安装了 NDK、CMake、LLDB。但我收到此错误:“Gradle 同步失败:找不到方法 externalNativeBuild()”

这是我的 build.gradle:

    apply plugin: 'com.android.application'

repositories {
    mavenCentral()
}

configurations {
    compile.exclude module: 'support-v4'
}

dependencies {
    compile 'com.google.android.gms:play-services-gcm:9.6.1'
    compile 'com.google.android.gms:play-services-maps:9.6.1'
    compile 'com.google.android.gms:play-services-vision:9.6.1'
    compile 'com.android.support:support-core-ui:24.2.1'
    compile 'com.android.support:support-compat:24.2.1'
    compile 'com.android.support:support-core-utils:24.2.1'
    compile 'net.hockeyapp.android:HockeySDK:4.0.1'
    compile 'com.googlecode.mp4parser:isoparser:1.0.6'
}

android {
    compileSdkVersion 24
    buildToolsVersion '24.0.2'

    useLibrary 'org.apache.http.legacy'
    defaultConfig.applicationId = "org.telegram.messenger"

    sourceSets.main.jniLibs.srcDirs = ['./jni/']

    externalNativeBuild {
        ndkBuild {
            path "/jni/Android.mk"
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }

    signingConfigs {
        debug {
            storeFile file("config/release.keystore")
            storePassword RELEASE_STORE_PASSWORD
            keyAlias RELEASE_KEY_ALIAS
            keyPassword RELEASE_KEY_PASSWORD

        }

        release {
            storeFile file("config/release.keystore")
            storePassword RELEASE_STORE_PASSWORD
            keyAlias RELEASE_KEY_ALIAS
            keyPassword RELEASE_KEY_PASSWORD

        }
    }

    buildTypes {
        debug {
            debuggable true
            jniDebuggable true
            signingConfig signingConfigs.debug
            applicationIdSuffix ".beta"
        }

        release {
            debuggable false
            jniDebuggable false
            signingConfig signingConfigs.release
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

        foss {
            debuggable false
            jniDebuggable false
            signingConfig signingConfigs.release
        }
    }

    defaultConfig.versionCode = 851

    sourceSets.debug {
        manifest.srcFile 'config/debug/AndroidManifest.xml'
    }

    sourceSets.release {
        manifest.srcFile 'config/release/AndroidManifest.xml'
    }

    sourceSets.foss {
        manifest.srcFile 'config/foss/AndroidManifest.xml'
    }

    productFlavors {
        x86 {
            ndk {
                abiFilter "x86"
            }
            versionCode = 2
        }
        armv7 {
            ndk {
                abiFilter "armeabi-v7a"
            }
            versionCode = 1
        }
        fat {
            versionCode = 3
        }
    }

    applicationVariants.all { variant ->
        def abiVersion = variant.productFlavors.get(0).versionCode
        variant.mergedFlavor.versionCode = defaultConfig.versionCode * 10 + abiVersion;
    }

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 24
        versionName "3.13.1"

        externalNativeBuild { ndkBuild {
                arguments "NDK_APPLICATION_MK:=jni/Application.mk", "APP_PLATFORM:=android-14"
                abiFilters "armeabi-v7a", "x86"
            }
        }
    }
}

apply plugin: 'com.google.gms.google-services'

Gradle 似乎还没有链接到现有的 C++ 库。但是,我不知道如何手动将 Gradle 链接到存在 Android.mk。有任何想法吗?

4

1 回答 1

0

几个猜测:

  • 确保您使用的是 ndk-r12 或 ndk-r13(检查您的 local.properties 文件)。更改 ndk 版本后, rm -fr TMessagesProj/.externalNativeBuild [这是当前 android studio 所需要的]
  • gradle 和本机代码之间的唯一联系是您已经存在的顶级 Android.mk,只需将其路径更改为“jni/Android.mk”[它需要是您的 $project/build.gradle 文件的相对路径。
  • 可能不需要 build.gradle 中的 jniLibs.srcDirs 行:共享库将自动打包到 APK 中,除非您有其他用途。构建的本机库没有保存在那里

我确实安装了cmake,不确定这是否重要。https://developer.android.com/studio/projects/add-native-code.html。您的项目可以使用我的假 json 文件构建,因此您的系统应该非常接近。

于 2016-10-16T05:33:50.973 回答