调试C++/本机库模块不适用于Android Studio(使用Cmake) 我在调试库模块的C++文件时遇到了麻烦。

调试C++/本机库模块不适用于Android Studio(使用Cmake) 我在调试库模块的C++文件时遇到了麻烦。,android,android-studio,debugging,android-ndk,cmake,Android,Android Studio,Debugging,Android Ndk,Cmake,一般来说,这是可能的吗 如果应用程序包含C++代码,则调试正常。 但是我想把C++代码移到库模块。 启动会话时的错误消息: apply plugin: 'com.android.library' android { compileSdkVersion 24 buildToolsVersion "25.0.2" defaultConfig { minSdkVersion 16 targetSdkVersion 21 versionCode 1 versionN

一般来说,这是可能的吗

<调试>如果应用程序包含C++代码,则调试正常。 但是我想把C++代码移到库模块。

启动会话时的错误消息:

apply plugin: 'com.android.library'


android {
compileSdkVersion 24
buildToolsVersion "25.0.2"
defaultConfig {

    minSdkVersion 16
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"
    externalNativeBuild {
        cmake {
            arguments "-DANDROID_PLATFORM_LEVEL=${11}",
                    '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static'
        }
    }
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-annotations:24.2.0'
}
现在启动本机调试会话

注意!找不到符号目录-请检查本机调试配置

我的库的渐变文件:

apply plugin: 'com.android.library'


android {
compileSdkVersion 24
buildToolsVersion "25.0.2"
defaultConfig {

    minSdkVersion 16
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"
    externalNativeBuild {
        cmake {
            arguments "-DANDROID_PLATFORM_LEVEL=${11}",
                    '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static'
        }
    }
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-annotations:24.2.0'
}
在运行配置中,调试器设置为自动


新增内容:

apply plugin: 'com.android.library'


android {
compileSdkVersion 24
buildToolsVersion "25.0.2"
defaultConfig {

    minSdkVersion 16
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"
    externalNativeBuild {
        cmake {
            arguments "-DANDROID_PLATFORM_LEVEL=${11}",
                    '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static'
        }
    }
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-annotations:24.2.0'
}
即时通讯使用:

apply plugin: 'com.android.library'


android {
compileSdkVersion 24
buildToolsVersion "25.0.2"
defaultConfig {

    minSdkVersion 16
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"
    externalNativeBuild {
        cmake {
            arguments "-DANDROID_PLATFORM_LEVEL=${11}",
                    '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static'
        }
    }
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-annotations:24.2.0'
}
格拉德尔:2.2.3

安卓工作室:2.2.3


在LLLB控制台中,我使用以下命令检查断点列表:

断点列表-v

我所有的检查点都列在那里

不工作断点

1: file = 'C:\android-dev\...\test.cpp', line = 19, exact_match = 0
1: file = 'C:\android-dev\...\test.cpp', line = 19, exact_match = 0
    1.1: 
      module = C:\android-dev\...\test.so
      compile unit = gl_code.cpp
      function = testFunc(..)
      location = C:\android-dev\...\test.cpp:16
      address = 0x0000007f871d068c
      resolved = true
      hit count = 1   
…就这些

工作断点

1: file = 'C:\android-dev\...\test.cpp', line = 19, exact_match = 0
1: file = 'C:\android-dev\...\test.cpp', line = 19, exact_match = 0
    1.1: 
      module = C:\android-dev\...\test.so
      compile unit = gl_code.cpp
      function = testFunc(..)
      location = C:\android-dev\...\test.cpp:16
      address = 0x0000007f871d068c
      resolved = true
      hit count = 1   

几个月前,我在自己的库中遇到了类似的问题,因为我认为如果我添加了-g(gcc)标志,它将生成调试符号,就像桌面(linux、unix内核)应用程序一样

但是,实际上生成调试符号是不起作用的

我看到您使用Cmake作为外部构建工具和clang编译器

因此,在我的例子中,我使用gcc配置cmake脚本,但不使用gradle脚本,但我认为这是相同的,我在cmake\u CXX\u标志中添加了-mapcs框架

externalNativeBuild {
        cmake {
            arguments "-DANDROID_PLATFORM_LEVEL=${11}",
                    '-DANDROID_TOOLCHAIN=gcc', 
                    '-DANDROID_STL=gnustl_static',
                    'DCMAKE_CXX_FLAGS=-mapcs-frame'
        }
    }
我知道,如果你使用铿锵编译可能是这个标志无法工作。但我的想法是分享我在android本机调试方面的经验

我希望这些线索能对你有所帮助

干杯。

Unai.

原因似乎是,创建了lib的发布版本, 它不支持调试,即使应用程序是使用调试选项构建的

解决方案:

apply plugin: 'com.android.library'


android {
compileSdkVersion 24
buildToolsVersion "25.0.2"
defaultConfig {

    minSdkVersion 16
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"
    externalNativeBuild {
        cmake {
            arguments "-DANDROID_PLATFORM_LEVEL=${11}",
                    '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static'
        }
    }
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-annotations:24.2.0'
}
要解决此问题,请执行以下变通方法。它确保生成调试版本


在应用程序build.gradle中更改:

compile project(':nativelib')


在libs build.gradle中添加:

android {

    publishNonDefault  true //this line

    compileSdkVersion 24
    buildToolsVersion "25.0.2"
    defaultConfig {
    ...
    }
...
}    
更新:

apply plugin: 'com.android.library'


android {
compileSdkVersion 24
buildToolsVersion "25.0.2"
defaultConfig {

    minSdkVersion 16
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"
    externalNativeBuild {
        cmake {
            arguments "-DANDROID_PLATFORM_LEVEL=${11}",
                    '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static'
        }
    }
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-annotations:24.2.0'
}
有关更新,请参阅谷歌问题:

我也有同样的错误(“注意!找不到符号目录-请检查您的本机调试配置。”)。我的解决方案是(Android Studio 3.2):

跑→ 编辑配置→ “调试器”选项卡→ 将工作路径添加到符号目录


谢谢你的建议。我试着用gcc和你的参数来编译它。仍然存在同样的问题。也许您已经这样做了,您是否正在使用gradle实验来调试本机库?我通常使用gradle 0.7.0进行实验,我使用gradle 2.2.3。文档说,它从2.2.0开始就受到支持,“符号目录的路径”是什么?特别是考虑到构建了多个本机库(x86、x86_64等)?@GoZoner老实说,我只是将其设置为“本机库”工作目录(或您模块的目录),它似乎工作正常。请参阅:。在Android Studio 3.3.1中,我似乎没有收到任何关于找不到符号目录的错误。但是,在我从@ BrKeAL添加符号目录的方向之前,调试器不会停止在库中的本机C++代码中的断点上。我添加的目录是“library/build/intermediates/cmake/debug/obj”,其中包含每个平台(x86、arm64-v8a等)的文件夹。您还应该选择“调试”“Build Variants”窗口中的应用程序配置。@GoZoner I添加了以下符号目录,然后在那里/Users/MYUSERNAME/Library/Android/sdk/Build tools/29.0.0/lib64/Users/MYUSERNAME/Library/Android/sdk/Build tools/29.0.0/lib正常工作,以防任何人不想阅读上面链接的问题,它指出,Gradle Android插件的旧版本用于打包发布库,即使应用程序设置为调试。但是,现在已经解决了这个问题,因此选择调试应用程序也将选择调试库。此处为正式文件: