如何构建/调试Android Studio外部源库
How to Build/Debug Android Studio External Source Library?
我一直试图在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文件。
我正在寻找无论如何我可以构建和调试第三方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++源代码。
谢谢。
通常,我建议使用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
文件假定它是构建的顶层,因此,如果没有您的一些黑客行为,这种方法将无法工作(问题是它在其顶层CMakeLists.txt
文件中使用CMAKE_SOURCE_DIR
)。另一种选择可能是使用ExternalProject。这虽然不太方便,但更灵活,因为它允许你从任何类型的外部项目引入构建,在它们自己的沙盒中构建这些项目,然后你的主构建用于链接,等等。它还有一个优点,它可以为您下载mapbox的源代码,因此您不必将其直接添加到您自己的项目源代码中。与其在这里重复,我建议您参考以下链接,了解现有的问题和答案,这些问题和答案应该为您指明使用ExternalProject
的正确方向。
- 一个相当简单的例子,带有一些有用的注释
- Kitware关于如何使用ExternalProject的博客文章(链接归功于此答案)
- 一系列关于使用GoogleTest的答案,这些答案可能会激发一些想法,并突出一些需要注意的事情(检查所有答案,而不仅仅是评分最高的)。
如果这还不够清楚,请在评论中告诉我,或者开始聊天,我会尽量为你进一步澄清这个答案。
- Android Studio 中带有静态库的原生C++代码
- 如何在 Android Studio 4 中编译 C/C++ 原生代码
- Android Studio:如何在build.gradle中定义自定义宏(针对不同的构建变体),并让原生C / C++
- 更新后的Android Studio现在需要Clang,不再链接到GCC的库
- 如果我的手机是 ARMv8,为什么 Android Studio 会C++编译为 ARMv7?
- Android NDK - 无法在 Visual Studio 2017 中调试
- 将图像从 Android Studio 发送到 CPP
- 在 Android Studio 中使用 C++ 共享对象时出现问题
- CMake:Android Studio 原生活动项目无法在项目根目录之外找到第三方库
- C++17 标准库包括不适用于 Visual Studio 2017 中的 Android 项目
- 如何在Android Studio中将C++文件正确链接到现有的Android项目?
- 在 Android Studio 中添加 C/C++ 的包含路径
- Android Studio-在现有的旧项目中启用本机C++调试(card.io Android Source)
- 为什么只有一个库的链接器错误'multiple definitions'?在 Android Studio 中使用 CMake (3.4.1)
- 如何调试visual studio 2017生成的C++代码.android中的SO文件和其他第三方库
- Android Studio 3.5.1 和 NDK 20.0 找不到 cstdint
- 将Visual Studio 2017配置为使用现有的Android SDK和NDK组件
- 如何使用Java Native Interface在C++中导入python库-Android Studio
- Android Studio External Native Build 预编译标头
- Android Studio TextView Init C++