Shlublu Shlublu - 1 month ago 8
Android Question

Android Studio 2.0's inline compiler does no longer recognize native code

I am currently working on a library that contains Java and native code.

The build works well, and so does the execution of the code when this lib is used by a client application. But the inline compiler of Android Studio 2.0 beta 2 does no longer recognize my NDK code properly (while this was OK with Studio 1.5):


  • All natives appear red in the Java code while they are properly mapped through
    JNI_OnLoad()
    :



native looks broken


  • The whole C code is highlighted in red as Studio cannot find the includes and symbols:



red C includes

...

red C code

I didn't have this problem before switching from Android Studio 1.5 to Studio 2.0 beta 2. Studio was able to reverse engineer the code in a way the
JNI_OnLoad()
mapping between the Java native methods and native C code was detected.
#include<>
directives and so on were OK too.

I don't know how to restore this behaviour: I investigated in developer.android.com and here in SO but I found nothing about that. I also digged into the Studio Settings with no success. I'm still investigating though.

My Gradle settings follow:


  • Gradle version: 2.10

  • gradle.properties:

    android.useDeprecatedNdk = true

  • Project's build.gradle:

    buildscript {
    repositories {
    jcenter()
    }
    dependencies {
    classpath 'com.android.tools.build:gradle:2.0.0-beta2'
    }
    }

    allprojects {
    repositories {
    jcenter()
    }
    }

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

  • Module's build.gradle:

    apply plugin: 'com.android.library'

    android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultPublishConfig 'release'
    publishNonDefault true

    defaultConfig {
    minSdkVersion 16
    targetSdkVersion 21
    }

    compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
    }

    buildTypes {
    release {
    ndk {
    moduleName "mylib"
    ldLibs "log"
    }

    debuggable false
    jniDebuggable false
    minifyEnabled false
    }

    debug {
    ndk {
    moduleName "mylib"
    ldLibs "log"
    cFlags "-g"
    }

    debuggable true
    jniDebuggable true
    minifyEnabled false
    }
    }

    productFlavors {
    library {
    }
    }
    }

    dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    }



As I suspected the debug info to be missing for the IDE to do the reverse engineering properly, I also tried using exactly the same config for
debug
and
release
(with the
-g
flag on,
debuggable true
, and
jniDebuggable true
), but this doesn't change anything.

EDIT, 20160212: researches led me to think this is a bug in the NDK integration of Studio 2.0, so I opened a Google Code ticket.

Answer

This has been fixed in Android Studio 2.2, but only for 64 bits. The deprecated NDK toolchain must be replaced by CMake in the project configuration.