-1


Я пытаюсь использовать экспериментальный плагин Gradle для своих проектов NDK, но он не компилирует ndk. Все выглядит отлично - Android Studio понимает мой C-код, может переходить с Java на родной и так далее, но когда я запускаю «Build», шаг компиляции ndk пропускается - я не вижу таких задач, как «compileNdk».
Когда я список всех доступных задач поКомпиляция NDK с экспериментальным плагином gradle

gradlew tasks 

нет TAKS как «compileNdk» тоже. Папка «Libs» также пуста, поэтому, когда я пытаюсь вызвать собственный метод, сбой приложения с «UnsatisfiedLinkError».
Итак, что мне не хватает? Как сказать градиенту скомпилировать NDK?

Моя конфигурация является:
корень build.gradle:

buildscript { 
repositories { 
    jcenter() 
} 
dependencies { 
    classpath 'com.android.tools.build:gradle-experimental:0.3.0-alpha5' 

    // NOTE: Do not place your application dependencies here; they belong 
    // in the individual module build.gradle files 
} 
} 

allprojects { 
    repositories { 
     jcenter() 
    } 
} 

task clean(type: Delete) { 
    delete rootProject.buildDir 
} 

модуль build.gradle:

apply plugin: 'com.android.model.application' 

model 
{ 
    android { 
     compileSdkVersion = 23 
     buildToolsVersion = "23.0.1" 

     defaultConfig.with { 
      applicationId = "com.kaspersky.experimentalcpp" 
      minSdkVersion.apiLevel = 14 
      targetSdkVersion.apiLevel = 23 
      versionCode = 1 
      versionName = "1.0" 
     } 
    } 

    android.buildTypes { 
     debug { 
      ndk.with { 
       debuggable = true 
      } 
     } 
     release { 
      minifyEnabled = false 
      proguardFiles += file('proguard-rules.pro') 
     } 
    } 

    android.sources { 
     main { 
      jni { 
       source { 
        srcDirs 'src/main/jni' 
       } 
      } 
     } 
    } 

    android.ndk { 
     moduleName = "test_experimental" 

     stl = "stlport_static" 

     cppFlags += "-Isrc/main/jni".toString() 

     ldLibs += ["log"] 
     ldLibs += ["android"] 
    } 

    android.productFlavors { 
     create("arm") { 
      ndk.abiFilters += "armeabi" 
     } 
     create("arm7") { 
      ndk.abiFilters += "armeabi-v7a" 
     } 
     create("fat") 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:23.1.0' 
} 

Я использую Android Studio 1.4.1 на Windows, 7. ndk.dir указывает на папку «ndk-bundle», загруженную AS.
Любая помощь оценена!

+0

Задачи теперь называется '' compileArmeabiDebugtest_experimentalSharedLibrarytest_experimentalMainCpp' и linkArmeabiDebugtest_experimentalSharedLibrary' и т.д. Я использую ** Gradle 0.2.0 ** –

+1

вашего модуля построить файл выглядит файл мне. Но попробуйте удалить раздел 'android.sources {}', а затем очистите и перестройте свой проект. Дайте нам знать, что происходит. – shailenTJ

+0

Спасибо, я выясню причину, см. Мой ответ ниже – noktigula

ответ

0

Итак, после некоторых исследований я выяснил, что мои библиотеки фактически компилируются, они просто помещаются не в папку «libs», а в «build/intermediates/binaries/...». Я дал результат .so и понял, что моих методов JNI не было. Причина в том, что мои методы JNI были объявлены в файле .h. После переименования .h в .cpp все работает нормально (кроме отладки). Может быть, это поможет кому-то еще!

+0

Вы имеете в виду, что ваши методы JNI были определены в файле .h? Объявление их в .h в порядке. Определение методов в .h особенно не рекомендуется в любой среде C/C++, Android или иным образом. В частности, поведение по умолчанию заключается в том, что файлы заголовков не скомпилируются, если только некоторые файлы .c или .cpp # не включают их. –

Смежные вопросы