繁体   English   中英

在 Android Studio 中调试预构建的共享库

[英]Debugging a prebuilt shared library in Android Studio

我正在尝试使用 C++ 共享库,该库单独构建,并且仅将二进制文件复制到我的 Android 项目中。
除调试外,一切正常。
Android Studio 的 lldb 调试器只是跳过了共享库 API 调用的那一行。
二进制文件是用所有需要的符号构建的。

你能给我一些想法我可以尝试什么吗?
谢谢。


以下是我的 Android Studio 设置、build.gradle 和 cmake。 在此处输入图片说明

构建.gradle

defaultConfig {
    externalNativeBuild {
        cmake {
            cppFlags ''
            arguments "-DANDROID_STL=c++_shared"
        }
    }
    ndk {
        abiFilters "x86"
        //abiFilters "x86_64"
    }
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
    debug {
        minifyEnabled false
        debuggable true
        jniDebuggable true
        renderscriptDebuggable true
    }
}

packagingOptions {
    doNotStrip "/x86/*.so"
    //doNotStrip "/x86_64/*.so"
}

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

externalNativeBuild {
    cmake {
        path file('CMakeLists.txt')
        version '3.10.2'
    }
}

sourceSets {
    main {
        jniLibs.srcDirs = ['/src/main/libnode/bin']
    }
}

制作

add_library(libnode SHARED IMPORTED)
set_target_properties(
    libnode
    PROPERTIES IMPORTED_LOCATION
    ${CMAKE_SOURCE_DIR}/src/main/libnode/bin/${CMAKE_ANDROID_ARCH_ABI}/libnode.so)

add_library(
    native-lib
    SHARED
    src/main/cpp/native-lib.cpp)

target_link_libraries(
    native-lib
    libnode
    ${log-lib})
  • 共享库需要使用 Android Studio 理解的构建 ID 构建,将其添加到您的链接选项中:

"-Wl,--build-id=sha1"

(抱歉,我编辑 CMake 已经有一段时间了)。 可以在NDK 构建维护者指南中找到有关构建 ID 的更多信息

  • 库的源需要由 Android Studio 索引,源根目录中的源的符号链接就足够了。 例如在/src/main/cpp/myLib

  • 需要在库中内置的源和磁盘上的源之间进行 LLDB 映射。 也就是说,如果库是在其他机器上构建的,并且符号对该机器是唯一的,则您需要“映射”符号,以便 LLDB 可以在您的机器上找到源。

    • 在 NDK 中找到共享库的构建三元组的 objdump,我的位于toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-objdump (在本例中它是 aarch64-linux-android,对于arm64 库),在库上运行 objdump:

aarch64-linux-android-objdump -C -l -d myLib.so | grep \\\\.cpp

这将打印出调试符号何时/何地构建的路径。

  • 如果库是在 /a/b/c 文件夹中的机器上构建的,则共享库中的所有相关符号的格式/a/b/c/myLib/src/myFile.cpp ,并且相同文件位于您机器上的/Studio/x/y/z/src/main/cpp/myLib/src/myFile.cpp您需要创建从/a/b/c/Studio/x/y/z/src/main/cpp的 LLDB 映射/Studio/x/y/z/src/main/cpp

    • 进入运行 > 编辑配置
    • 将调试器设置为混合(或仅本机)
    • 设置以下命令: settings append target.source-map /a/b/c /Studio/x/y/z/src/main/cpp

如果您使用的是 windows,只需将路径提供为 windows 路径,即使库是在 cygwin 或 bash 中构建的,也请完全按照 objdump 提供的路径复制路径。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM