-1


我正在尝试为我的NDK项目使用实验性Gradle插件,但它不编译ndk。一切看起来都很好--Android Studio理解我的C代码,可以从Java跳到本地等等,但是当我运行“Build”时,编译ndk的步骤被跳过 - 我看不到像“compileNdk”这样的任务。
当我通过使用gradle实验性插件编译NDK

gradlew tasks 

列出所有可用的任务有像“compileNdk”还没有TAKS。 “Libs”文件夹也是空的,所以当我尝试调用本地方法时,应用程序崩溃与“UnsatisfiedLinkError”。
那么我错过了什么?如何分辨gradle编译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 1.4.1工作室在Windows 7上ndk.dir指向由AS下载的“ndk-bundle”文件夹。
任何帮助表示赞赏!

+0

这些任务现在被称为'compileArmeabiDebugtest_experimentalSharedLibrarytest_experimentalMainCpp'和'linkArmeabiDebugtest_experimentalSharedLibrary'等。我正在使用** 0.2.0 ** –

+1

您的模块的Gradle构建文件为我查找文件。但是,尝试删除'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文件包含它们。 –