Rab*_*ant 5 c++ android cmake gradle lldb
我有一个看起来像这样的项目:
- project
- app
- src.../cpp/
- src.../java/
- other modules...
Run Code Online (Sandbox Code Playgroud)
cpp代码是在build.gradle中使用cmake构建的:
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
Run Code Online (Sandbox Code Playgroud)
和
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"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
其中 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/)
Run Code Online (Sandbox Code Playgroud)
生成的.so库通过SQL作为扩展加载到SQLite中:
Select load_extension('libsqlite_gcd_func', null)
Run Code Online (Sandbox Code Playgroud)
之后库中定义的函数可用于 SQL 查询。
这一切都有效。
调试不起作用;CPP 代码中设置的断点不会触发。
我认为这是因为代码是在运行时动态加载的;我还尝试通过以下方式使用 java 直接加载模块:
java.lang.System.loadLibrary("sqlite_gcd_func");
Run Code Online (Sandbox Code Playgroud)
但断点还是不行。
我对 lldb 的了解很少;我假设我需要告诉它加载的模块(通过 lldb 中的“图像列表”可见)是一个已知模块,但不知道如何执行此操作(如果这甚至是问题)。
任何告诉 gradle/lldb/Android Studio 如何调试此代码的帮助将不胜感激!
编辑:
我创建了一个具有类似设置的更简单的项目,并且它是可调试的。在不可调试的情况下,当我进入 lldb 并运行“image list”时,有问题的 .so 显示如下:
C:\Users\ME\.lldb\module_cache\remote-android\.cache\8D1C60AA-E947-56CA-CBA5-0AA7A46B955E-73E37532\libname.so
Run Code Online (Sandbox Code Playgroud)
(即看起来像是从 AVD 复制的版本)。
而在我可以调试的那个中,它显示在:
C:\...\project\app\build\intermediates\cmake\debug\obj\x86\libname.so
Run Code Online (Sandbox Code Playgroud)
IE。构建区域中的实际库。
由于某种原因,lldb 似乎不使用本地应用程序版本。
知道什么会导致这种情况吗?
事实证明这是由于 AS 中的一个旧错误造成的。显然,过去 IML 文件中“native-android-gradle”部分中的“SELECTED_BUILD_VARIANT”可能会与实际选择的风格不一致。这导致无法加载 .so 文件。
更正后,该值现在似乎仍然是最新的,以下是讨论(现已修复)错误的链接:
https://issuetracker.google.com/issues/37114841
据我所知,项目同步也可以解决问题(但对我来说没有)。