2016-10-13 3 views
1

Je rencontre un problème lorsque j'essaie de créer le code source Telegram dans Android Studio (https://github.com/DrKLO/Telegram).Lien vers la bibliothèque native

J'ai installé NDK, CMake, LLDB. Mais j'eu cette erreur: "synchronisation Gradle a échoué: Impossible de trouver la méthode externalNativeBuild()"

Voici mon 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' 

Il semble que le Gradle n'a pas lié à l'existence bibliothèque C++ encore. Mais, je ne savais pas comment je lier manuellement Gradle pour exister Android.mk. Des idées? S'il vous plaît aidez-moi. Beaucoup apprécie!

Répondre

0

Quelques suppositions:

  • Assurez-vous que vous utilisez NDK-r12 ou NDK-r13 (vérifiez votre fichier local.properties). Après avoir changé la version de ndk, rm -fr TMessagesProj/.externalNativeBuild [ceci est nécessaire pour le studio android actuel]
  • La seule connexion entre le code gradle et le code natif est votre haut niveau Android.mk qui est déjà là, il suffit de changer son chemin vers 'jni/Android.mk' [il doit être relatif à votre fichier $ project/build.gradle.
  • Peut-être ligne jniLibs.srcDirs dans votre build.gradle n'est pas nécessaire: le lib partagé sera automatiquement emballé dans APK, sauf si vous avez d'autres fins. Les bibliothèques natives construites ne sont pas enregistrées là

J'ai eu cmake installé, pas sûr que cela compte. https://developer.android.com/studio/projects/add-native-code.html. Votre projet pourrait être construit avec mon faux fichier json, donc votre système devrait être assez proche.

+0

Très utile! Merci beaucoup, je vais essayer cela. :) –