簡體   English   中英

Android Studio CMake - 共享庫缺少 libc++_shared.so? CMake 可以捆綁這個嗎?

[英]Android Studio CMake - shared library missing libc++_shared.so? Can CMake bundle this?

現在 Android Studio 2.2 正式發布,我正在從我舊的 ndk-build 過程遷移到嘗試在 AS 中使用 CMake。 由於我從公司內部合並了幾個代碼庫(我無法編輯),這些代碼庫大量使用 C++11 代碼(包括可怕的 std::to_string() 方法),我可以編譯的唯一方法是選擇幾個配置選項 - 所有這些都是我之前開始使用 ndk-build 時發現的。 (見下文)

所以一切都再次編譯並構建到 APK 中 - 我 100% 驗證我的輸出共享庫存在於 APK 中,但我無法成功使用System.loadLibrary('mylibrary') - 事實證明這是因為缺少依賴項libc++_shared.so

如,我收到以下錯誤:

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

在我舊的 ndk-build 過程中,我總是在輸出文件夾中使用 2 個庫( mylibrary.solibc++_shared.so ),從而將它們捆綁到應用程序中。 似乎 CMake 工具鏈根本沒有捆綁libc++_shared.so (實際上,它在 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)

我只是將此腳本添加到 moudle 的 build.gradle 中:

externalNativeBuild {
        cmake {
            cppFlags ""
            arguments "-DANDROID_STL=c++_shared"
        }
    }

它將在 apk 文件中打包“libc++_shared.so”

我寫了一個應該打包 STL 文件的 CMake 配置: https : //github.com/jomof/ndk-stl/blob/master/ndk-stl-config.cmake

將此文件復制旁邊的CMakeLists.txt和里面CMakeLists.txt

include(ndk-stl-config.cmake)

如果您有問題,請告訴我

將此添加到您的build.gradle (Module: app)

externalNativeBuild {
            cmake {
                cppFlags "-std=c++14 -fexceptions -frtti"
                arguments "-DANDROID_ARM_NEON=TRUE",'-DANDROID_STL=c++_shared'
            }
        }

正如 Gerry 所指出的,音頻回聲示例項目 ( 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替換為您的目標名稱。

在 Application.mk 中添加以下行

APP_STL := c++_shared

只是包括

APP_STL := c++_shared

在你的Application.mk中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM