调试C++/本机库模块不适用于Android Studio(使用Cmake) 我在调试库模块的C++文件时遇到了麻烦。
一般来说,这是可能的吗 <调试>如果应用程序包含C++代码,则调试正常。 但是我想把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
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插件的旧版本用于打包发布库,即使应用程序设置为调试。但是,现在已经解决了这个问题,因此选择调试应用程序也将选择调试库。此处为正式文件: