Android Studio CMake-общая библиотека отсутствует libc++ общий доступ.и что? Может ли CMake связать это?

теперь, когда Android Studio 2.2 официально выпущен, я мигрирую из своего старого процесса сборки ndk, чтобы попытаться использовать CMake в AS. Поскольку я включаю несколько кодовых баз из своей компании (которые я не могу редактировать), которые интенсивно используют код C++11 (включая ужасный метод std::to_string ()), единственный способ, которым я могу скомпилировать, - это выбрать несколько параметров конфигурации, все из которых я обнаружил ранее, начиная работу с ndk-build. (см. ниже)

так все компилируется снова и строит в APK - и я 100% проверяю, что моя выходная общая библиотека существует в APK, но я не могу успешно использовать System.loadLibrary('mylibrary') - и оказывается, это потому, что зависимость libc++_shared.так что отсутствует.

как и в, я получаю следующую ошибку:

java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found

в моем старом процессе сборки ndk я всегда заканчивал с 2 библиотеками (mylibrary.так что и libc++_shared.так что) в моей выходной папке, которая тем самым получила в комплекте вместе в приложение. Кажется, CMake toolchain не связывает libc++_shared.так вообще (действительно, он не найден в APK).

Я бьюсь головой об это в течение 6 часов. Могу ли я каким-то образом получить цепочку инструментов CMake для связывания этой отсутствующей библиотеки? Есть зацепки?

.

.

Мои настройки:

в gradle.build:

externalNativeBuild {
        cmake {
            arguments '-DANDROID_STL=c++_shared', '-DANDROID_TOOLCHAIN=gcc', '-DANDROID_PLATFORM=android-16'
        }
    }

и мои CMakeLists.txt (имена файлов, вырезанные для краткость):

cmake_minimum_required(VERSION 3.4.1)

set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -std=gnu++11")

include_directories(.)
include_directories(./other)

set(my_SRCS jniInterface.cpp
    etc.cpp)


add_library(mylibrary SHARED ${my_SRCS})

target_link_libraries(mylibrary atomic log)

3 ответов


Я написал конфигурацию CMake, которая должна упаковать файлы STL: https://github.com/jomof/ndk-stl/blob/master/ndk-stl-config.cmake

скопируйте этот файл рядом с вашими CMakeLists.txt и внутри CMakeLists.txt do

включить(NDK-stl-config.с CMake)

Дайте мне знать, если у вас есть проблемы


как отметил Джерри, последние изменения в проекте образца audio-echo (https://github.com/googlesamples/android-ndk/pull/298) Включите изменения, которые работали для меня. Я добавил Это в нижнюю часть моих CMakeLists.txt-файл.

# Android Studio CMake does not pack stl shared libraries, so app needs to pack
# the right shared lib into APK. The following code find right stl type and copy
# the needed shared lib into app's app/src/main/jniLibs, android studio assembles
# it into the final APK
# Helper function to retrieve shared stl path and name in NDK
# stl_path: the path to the NDK's shared lib path; empty if not using shared stl
function(get_stl_info stl_path stl_name)
   # assume app not uses shared stl lib
   set(${stl_path} "" PARENT_SCOPE)
   if(NOT ${ANDROID_STL} MATCHES "_shared")
       return()
   endif()

   # using shared lib, config lib name and path
   if("${ANDROID_STL}" MATCHES "c\\+\\+_")
       # app uses c++_shared for stl type
       set(stlPath "llvm-libc++/libs/${ANDROID_ABI}")
       set(stlName "libc++_shared.so")
   elseif(${ANDROID_STL} MATCHES "gnustl_")
       set(stlPath "gnu-libstdc++/4.9/libs/${ANDROID_ABI}")
       set(stlName "libgnustl_shared.so")
   else()
       # this sample not supporting other stl types
       message(FATAL_ERROR "Not Suppored STL type: ${ANDROID_STL}")
       return()
   endif()

   set(${stl_path} ${ANDROID_NDK}/sources/cxx-stl/${stlPath} PARENT_SCOPE)
   set(${stl_name} ${stlName} PARENT_SCOPE)
endfunction()

# force copying needed shared stl lib into ${project}/app/src/main/jniLibs
# so it will be packed into APK
get_stl_info(ndk_stl_path  ndk_stl_name)
if(NOT ${ndk_stl_path} STREQUAL "")
    set(jniLibs_dir "${CMAKE_CURRENT_SOURCE_DIR}/../jniLibs")
    add_custom_command(TARGET mylibrary PRE_BUILD
                   COMMAND "${CMAKE_COMMAND}" -E
                   copy ${ndk_stl_path}/${ndk_stl_name}
                   "${jniLibs_dir}/${ANDROID_ABI}/${ndk_stl_name}"
                   COMMENT "Copying Shared library to the packing directory")
endif()

Я думаю, это обходной путь, без которого мы сможем обойтись в один прекрасный день... Обратите внимание, что вы должны изменить строку add_custom_command(TARGET mylibrary PRE_BUILD и заменить mylibrary с целевым именем.


включить

APP_STL := c++_shared

в вашем приложении.МК