2016-10-02 39 views
0

我一直在試圖構建和調試Android Studio 2.2內部的外部Java/C++源庫,但我無法弄清楚如何做到這一點,或者如果可能的話。如何構建/調試Android Studio外部源庫?

具體而言,我試圖使用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()); 
} 

它還創建一個應用程序/文件的CMakeLists.txt。

我正在尋找反正我可以建立和調試第三方C++源庫。我最好的猜測是,有一些方法可以修改嚮導生成的app/CMakeLists.txt文件,但我猜這是做什麼的,我無法弄清楚。

究其原因,我認爲這可能是正確的道路上走的是嚮導生成的應用程序/的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++源代碼。

謝謝。

回答

0

通常情況下,我建議使用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的正確方向的現有問題和解答。

如果還不夠清楚,請在評論中告訴我或者開始聊天,我會盡力爲您澄清這個問題。

+0

Thanks Craig。我對CMake完全陌生。我訂購了一本書來看看它是否會有所幫助,但那是距離抵達的幾周。我沒有在網上找到很多東西,甚至在Android Studio中進行調試的時候也更少。爲了闡明OP,我使用Make構建了庫,並使用它創建了一個項目,但是調試器不會進入C++,因此我不相信即使我理解了您的帖子,也會在解決問題之後解決問題閱讀您發送的鏈接。不錯,庫更新,但用AS調試真的是問題。讓我讀更多,然後我會帶你聊天提供。 – Mitch

+0

好的,我已經做了一些嘗試,但是一切都沒有成功,或者在某些情況下崩潰了Android Studio。我越看你的建議,越少我認爲它會起作用。原因是它看起來你的「沙箱」仍然會失去調試信息。當然是全新的,我只是在猜測這個。如果你認爲這可能允許鏈接,我會很高興給它一個。我需要更多的幫助來理解CMake命令的進行。謝謝。 – Mitch

+0

討論轉移到聊天[這裏](http://chat.stackoverflow.com/rooms/124759/cmake-and-mapbox-issue) –