【问题标题】:How to Build/Debug Android Studio External Source Library?如何构建/调试 Android Studio 外部源库?
【发布时间】:2016-10-02 23:08:32
【问题描述】:

我一直在尝试在 Android Studio 2.2 中构建和调试外部 Java/C++ 源库,但我无法弄清楚如何执行此操作或是否可行。

具体来说,我正在尝试使用 https://github.com/mapbox/mapbox-gl-native 库,但我怀疑任何 Java/C++ 库的解决方案都可能类似。在这种情况下,库包含一个 Makefile 和一个 CMakeLists.txt 文件。

我还没有看到 CMakeLists.txt 是如何使用的,但是我已经使用以下命令从源代码构建了 Mapbox 库:

BUILDTYPE=Debug make android

我使用 Android Studio 向导创建了一个项目,并选择了 C++ 选项,该选项创建了一个成功构建和调试的示例 .cpp:

// native-lib.cpp

#include <jni.h>
#include <string>

extern "C"
jstring
Java_com_example_kea_mapboxtest_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

它还会创建一个 app/CMakeLists.txt 文件。

无论如何,我都在寻找可以构建和调试第 3 方 C++ 源库的方法。我最好的猜测是有一些方法可以修改向导生成的 app/CMakeLists.txt 文件来执行此操作,但我猜这是要做什么,我不知道该怎么做。

我认为这可能是正确的道路的原因是向导生成的 app/CMakeLists.txt 包含:

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds it for you.
# Gradle automatically packages shared libraries with your APK.

    add_library( # Sets the name of the library.
                 native-lib

                 # Sets the library as a shared library.
                 SHARED

                 # Provides a relative path to your source file(s).
                 # Associated headers in the same location as their source
                 # file are automatically included.
                 src/main/cpp/native-lib.cpp

这似乎有效。我在想可能可以引用库 CMakeLists.txt 或在向导生成的 CMakeLists.txt 内的 Mapbox 源中找到的 Makefile。希望它构建的库是可调试的。或者,将其静态链接也是可以接受的,只要我可以调试到库中的 C++ 源代码。

谢谢。

【问题讨论】:

    标签: c++ android-studio makefile cmake mapbox-gl


    【解决方案1】:

    通常,我建议先使用add_subdirectory() 将地图框引入您的构建,然后使用target_link_libraries() 将您的native-lib 目标链接到它,如下所示:

    add_subdirectory(path/to/mapbox/src mapbox)
    add_library(native-lib SHARED src/main/cop/native-lib.cpp)
    target_link_libraries(native-lib PUBLIC mbgl-core)
    

    不幸的是,mapbox 项目的 CMakeLists.txt 文件假定它是构建的顶层,因此如果您没有一些黑客行为,这种方法将无法工作(问题是它在其顶层 @ 中使用了 CMAKE_SOURCE_DIR 987654333@ 文件)。另一种方法可能是改用ExternalProject。这不太方便但更灵活,因为它允许您从几乎任何类型的外部项目中引入构建,在它们自己的沙箱中构建此类项目,然后您的主构建用于链接等。它还具有以下优势也可以为您下载 mapbox 的源代码,因此您不必将其直接添加到您自己项目的源代码中。我不会在此重复所有内容,而是将向您推荐以下链接以获取现有问题和答案,这些链接应该为您指明使用 ExternalProject 的正确方向。

    如果还不够清楚,请在 cmets 中告诉我或开始聊天,我会尽力为您进一步澄清这个答案。

    【讨论】:

    • 谢谢克雷格。我对 CMake 完全陌生。我订购了一本书,看看它是否有帮助,但那是几周后到达的。我在网上找不到太多关于在 Android Studio 中调试的内容,甚至更少。为了澄清 OP,我使用 Make 构建了库并使用它创建了一个项目,但是调试器不会进入 C++,所以我不相信即使我理解你的帖子,它会在之后解决问题阅读您发送的链接。库更新很好,但使用 AS 进行调试确实是问题所在。让我阅读更多内容,然后我会带你接受聊天服务。
    • 好的,我做了一些尝试,但一切都没有做,或者在某些情况下会导致 Android Studio 崩溃。我越看你的建议,我就越觉得它不会奏效。原因是您的“沙盒”似乎仍会丢失调试信息。当然是全新的我只是在猜测。如果您认为这可能允许链接,我很乐意试一试。我需要更多帮助来理解 CMake 命令才能继续。谢谢。
    • 讨论转移到聊天here
    猜你喜欢
    • 2017-07-24
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多