Android Studio 2.0';s内联编译器不再识别本机代码

Android Studio 2.0';s内联编译器不再识别本机代码,android,android-studio,android-ndk,Android,Android Studio,Android Ndk,我目前正在开发一个包含Java和本机代码的库 当客户端应用程序使用该库时,构建工作正常,代码的执行也正常。但是Android Studio 2.0 beta 2的内联编译器不再正确识别我的NDK代码(而Studio 1.5也可以): 当通过JNI\u OnLoad()正确映射时,所有本地人在Java代码中显示为红色: 整个C代码以红色突出显示,因为Studio找不到包含项和符号: … 在从Android Studio 1.5切换到Studio 2.0 beta 2之前,我没有这个问

我目前正在开发一个包含Java和本机代码的库

当客户端应用程序使用该库时,构建工作正常,代码的执行也正常。但是Android Studio 2.0 beta 2的内联编译器不再正确识别我的NDK代码(而Studio 1.5也可以):

  • 当通过
    JNI\u OnLoad()
    正确映射时,所有本地人在Java代码中显示为红色:

  • 整个C代码以红色突出显示,因为Studio找不到包含项和符号:


在从Android Studio 1.5切换到Studio 2.0 beta 2之前,我没有这个问题。Studio能够以检测到Java本机方法和本机C代码之间的映射的方式对代码进行反向工程<代码>#include指令等也可以

我不知道如何恢复这种行为:我在某地和某地进行了调查,但我没有发现任何与此相关的情况。我还挖掘了工作室的设置,但没有成功。不过我还在调查

我的渐变设置如下:

  • 渐变版本:2.10

  • gradle.properties:

    android.useDeprecatedNdk = true
    
    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.0.0-beta2'
        }
    }
    
    allprojects {
        repositories {
            jcenter()
        }
    }
    
    task clean(type: Delete) {
        delete rootProject.buildDir
    }
    
    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'])
    }
    
  • 项目的构建。gradle:

    android.useDeprecatedNdk = true
    
    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.0.0-beta2'
        }
    }
    
    allprojects {
        repositories {
            jcenter()
        }
    }
    
    task clean(type: Delete) {
        delete rootProject.buildDir
    }
    
    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'])
    }
    
  • 模块的构建。渐变:

    android.useDeprecatedNdk = true
    
    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.0.0-beta2'
        }
    }
    
    allprojects {
        repositories {
            jcenter()
        }
    }
    
    task clean(type: Delete) {
        delete rootProject.buildDir
    }
    
    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'])
    }
    
由于我怀疑IDE在正确执行反向工程时缺少调试信息,因此我也尝试使用完全相同的配置进行
debug
release
(启用
-g
标志,
debugabletrue
jnidebugabletrue
),但这并没有改变任何事情


编辑,20160212:研究让我认为这是Studio 2.0的NDK集成中的一个bug,所以我打开了。

这在Android Studio 2.2中已经修复,但是。不推荐使用的NDK工具链必须在项目配置中替换为。

这已在Android Studio 2.2中修复,但是。不推荐使用的NDK工具链必须在项目配置中替换为。

会有帮助吗?@Onik您好,非常感谢。但这并没有帮助,因为这个链接显示了如何使C代码签名符合默认的JNI映射(基本上包括以与Java类的完全限定名+本机函数方法匹配的方式命名C代码函数)。我在这里所做的是不同的:我使用在JNI启动时调用的
JNI_Onload()
C函数中声明的显式匹配。奇怪的是,它用于Studio 1.5(我没有更改任何一行C代码,也没有更改任何一行Java代码)。我实际上指的是链接中关于禁用
NDK
插件以试图清除突出显示的代码的第3项。@Onik哦,对不起!是的,这就是我在这期间所做的,以防止我的屏幕全部变红。。。在等待修复时:)再次感谢!我就在这条船上。经过几个小时的反复试验,在1.5.1中得到一个可接受的C++经验,然后升级到2,然后2.1,我甚至无法获得代码格式在本地工作。幸运的是,我在搬家前得到了大部分javah签名。1.5.1甚至在包装阵列访问方面都非常酷。2.x使格式化成为猪耳朵。长期专业的本机支持将在下一次更新中提供。好的。能帮忙吗?@Onik嗨,非常感谢。但这并没有帮助,因为这个链接显示了如何使C代码签名符合默认的JNI映射(基本上包括以与Java类的完全限定名+本机函数方法匹配的方式命名C代码函数)。我在这里所做的是不同的:我使用在JNI启动时调用的
JNI_Onload()
C函数中声明的显式匹配。奇怪的是,它用于Studio 1.5(我没有更改任何一行C代码,也没有更改任何一行Java代码)。我实际上指的是链接中关于禁用
NDK
插件以试图清除突出显示的代码的第3项。@Onik哦,对不起!是的,这就是我在这期间所做的,以防止我的屏幕全部变红。。。在等待修复时:)再次感谢!我就在这条船上。经过几个小时的反复试验,在1.5.1中得到一个可接受的C++经验,然后升级到2,然后2.1,我甚至无法获得代码格式在本地工作。幸运的是,我在搬家前得到了大部分javah签名。1.5.1甚至在包装阵列访问方面都非常酷。2.x使格式化成为猪耳朵。长期专业的本机支持将在下一次更新中提供。是的,我现在运行的是3.1.4,现在仍然是这样,关于JNIEXPORT和JNICALL以及ANSI标准中所有内容的投诉包括文件(带有Cmake),红色下划线。编译工作没有问题,但是编辑器警报很好,但没有不可用的情况,因为它会对所有内容发出警告(声称JNIEXPORT和JNICALL是Microsoft的东西)。您的NDK包也是最新的吗?这可能是原因。可能是配置来自AS2时代的hello jni?@JanBergström很难说,这很奇怪。在本机代码中设置断点时是否也会遇到问题?我记得我有两个问题,如果我没有弄错的话,这两个问题都是同时解决的。断点有效,调试(所有数据都显示正常)有效,编译有效,但编辑器对ANSI库和jni.h中的所有标准函数都打上了红色标记。也就是说,本地定义的东西,如位掩码(define _int64)是MS stuff not supported等。本地定义的NULL不是红色下划线,而是红色文本。编辑器的右侧像一条红线。(就像AS 3.1.4(以及许多早期版本)编辑器找不到包含文件,但编译器找到了。我运行的是AS 3.1.4,它仍然是