调试Android Studio中动态加载的本机库
Debug a dynamically loaded native library in Android Studio?
我有一个看起来像这样的项目:
- 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:UsersME.lldbmodule_cacheremote-android.cache8D1C60AA-E947-56CA-CBA5-0AA7A46B955E-73E37532libname.so
(即。
虽然我可以调试的那个,但显示在:
中C:...projectappbuildintermediatescmakedebugobjx86libname.so
即。构建区域中的实际库。
lldb出于某种原因似乎不使用本地应用程序。
任何想法会导致什么?
这是由于AS中的一个旧错误造成的。显然,在过去,IML文件中的"本机android-Gradle"部分中的" Selected_build_variant"可能会随着实际选择的风味而逐步发展。这导致未能加载.so文件。
一旦纠正,此值似乎现在保持最新状态,以下是(现在固定(错误的讨论的链接:
https://issuetracker.google.com/issues/37114841
从我可以看出的是,一个项目同步 May 也可以解决该问题(对我来说不是(。
我也有一个类似的问题,我无法调试动态加载的本机库。事实证明,在将Android构建系统的条纹调试信息从我的库中放入APK之前。当我意识到我的300MB库一旦在APK中打包到30MB时,我就变得很清楚。
。您可以使用Android Gradle包装选项来禁用该行为。将类似的内容添加到您的build.gradle
文件:
android {
packagingOptions {
// By default .so libraries are striped from debug information when creating APK
// To prevent this make sure your .so files are matching that doNotStrip pattern
// See Gradle pattern document for details:
// https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/util/PatternFilterable.html
doNotStrip "**"
}
}
在Android Studio 2.3.3。
无效的缓存和重新启动。为我工作。
- Java JNI GDAL 本机库在重新部署为 Web 应用程序时出现类加载器错误
- 托管语言是否锁定本机库的刷新和重新加载变量?
- 将本机非托管的C DLL加载到托管的C#应用中,导致DLL输出垃圾
- 调试Android Studio中动态加载的本机库
- Excel 2016 VSTO 加载项与本机代码 DLL
- 无法加载生成的本机库
- Android本机运行时无法加载符号,即使它们实际上是在加载的.so文件中找到的
- 纯粹的分离性:无法开始活动;无法加载本地库
- 将临时对象保留在寄存器上以避免虚拟机中的额外存储/加载
- 在Visual Studio 2015中调试本机应用程序加载的托管DLL
- 通过JNI调用System.loadLibrary()不会加载本机方法
- 使用本机依赖项加载 CLR 库
- 由本机C++加载的 DLL 中的 C# 窗体
- Azure 网站是否支持 P/Invoke 来加载本机 C++ DLL
- 在客户端加载本机插件
- nodejs如何加载本机插件
- 使用本机DLL从同一文件夹加载程序集
- 我如何让IIS加载我的WCF服务引用的本机DLL
- 在进行托管到本机的互操作时,操作系统加载器锁定
- 在64位环境中加载本机COM dll