【发布时间】:2017-09-20 02:46:55
【问题描述】:
我有一个看起来像这样的项目:
- project
- app
- src.../cpp/
- src.../java/
- other modules...
cpp代码是在build.gradle中使用cmake构建的:
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
和
buildTypes {
...
debug {
debuggable true
jniDebuggable true
externalNativeBuild {
cmake {
arguments "-DCMAKE_BUILD_TYPE=Debug"
abiFilters "armeabi-v7a", "armeabi", "x86"
}
}
}
}
productFlavors {
...
experimental {
externalNativeBuild {
cmake {
targets "sqlite_gcd_func"
}
}
}
}
CMakeLists.txt 在哪里:
cmake_minimum_required(VERSION 3.6)
add_library( # Specifies the name of the library.
sqlite_gcd_func
# Sets the library as a shared library.
MODULE
# Provides a relative path to your source file(s).
src/Experimental/cpp/GreatCircleDistance.cpp )
# Specifies a path to native header files.
include_directories(src/Experimental/cpp/include/)
生成的 .so 库作为扩展通过 SQL 加载到 SQLite 中:
Select load_extension('libsqlite_gcd_func', null)
之后库中定义的函数可用于 SQL 查询。
这一切都有效。
调试什么不起作用; CPP 代码中设置的断点不会触发。
我认为这是因为代码是在运行时动态加载的;我也尝试过使用java直接加载模块:
java.lang.System.loadLibrary("sqlite_gcd_func");
但是断点仍然不起作用。
我对 lldb 的了解很少;我假设我需要告诉它加载的模块(通过 lldb 中的“图像列表”可见)是一个已知模块,但不知道如何这样做(如果这甚至是问题)。
任何帮助告诉 gradle/lldb/Android Studio 如何调试此代码将不胜感激!
编辑:
我用类似的设置创建了一个更简单的项目,它是可调试的。在不可调试的情况下,当我进入 lldb 并运行“图像列表”时,有问题的 .so 显示如下:
C:\Users\ME\.lldb\module_cache\remote-android\.cache\8D1C60AA-E947-56CA-CBA5-0AA7A46B955E-73E37532\libname.so
(即看起来像是从 AVD 复制的版本)。
而在我可以调试的那个中,它显示在:
C:\...\project\app\build\intermediates\cmake\debug\obj\x86\libname.so
即。构建区域中的实际库。
lldb 似乎出于某种原因不使用本地应用程序版本。
知道是什么原因造成的吗?
【问题讨论】:
标签: android c++ gradle cmake lldb