我正在尝试使用单独构建的 C++ 共享库,并且仅将二进制文件复制到我的 Android 项目中。
除调试外,一切正常。
Android Studio 的 lldb 调试器只是跳过了共享库 API 调用的那一行。
二进制文件是用所有需要的符号构建的。
你能告诉我一些我可以尝试的方法吗?
谢谢。
以下是我的 Android Studio 设置、build.gradle 和 cmake。
build.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})
答案 0 :(得分:0)
"-Wl,--build-id=sha1"
(抱歉,我编辑 CMake 已经有一段时间了)。 有关构建 ID 的更多信息,请参见 NDK build maintainers' guide
库的源代码需要由 Android Studio 编制索引,源根目录中的源代码的符号链接就足够了。例如在/src/main/cpp/myLib
需要在库中内置的源和磁盘上的源之间进行 LLDB 映射。也就是说,如果库是在其他机器上构建的,并且符号对该机器是唯一的,则您需要“映射”符号,以便 LLDB 可以在您的机器上找到源。
toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-objdump
中(在本例中它是 aarch64-linux-android,对于 arm64 库),在库上运行 objdump:< /li>
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
settings append target.source-map /a/b/c /Studio/x/y/z/src/main/cpp
如果您使用的是 windows,只需将路径提供为 windows 路径,即使库是在 cygwin 或 bash 中构建的,也请完全按照 objdump 提供的路径复制路径。