2016-09-21 4 views
5

अब एंड्रॉइड स्टूडियो 2.2 आधिकारिक तौर पर जारी किया गया है, मैं एएस के भीतर सीएमके को आजमाने और उपयोग करने के लिए अपनी पुरानी एनडीके-बिल्ड प्रक्रिया से माइग्रेट कर रहा हूं। चूंकि मैं अपनी कंपनी के भीतर से कई कोडबेस शामिल कर रहा हूं (जिसे मैं संपादित नहीं कर सकता) जो सी ++ 11 कोड का भारी उपयोग करता है (डरावनी std :: to_string() विधि सहित), मैं संकलित कर सकता हूं कुछ चुनिंदा कॉन्फ़िगरेशन विकल्प - जिनमें से सभी मैंने पहले खोज की थी जब ndk-build के साथ काम शुरू किया था। (नीचे देखें)एंड्रॉइड स्टूडियो सीएमके - साझा लाइब्रेरी libC++ _ shared.so? क्या सीएमके इसे बंडल कर सकता है?

तो सब कुछ फिर से संकलित करता है और एपीके में बनाता है - और मैं 100% सत्यापित करता हूं कि मेरी आउटपुट साझा लाइब्रेरी एपीके में मौजूद है, लेकिन मैं सफलतापूर्वक System.loadLibrary('mylibrary') का उपयोग करने में असमर्थ हूं - और यह पता चला है क्योंकि यह इसलिए है निर्भरता libC++ _ shared.so गुम है।

में के रूप में, मैं निम्नलिखित त्रुटि मिलती है:

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

मेरे पुराने NDK-निर्माण प्रक्रिया में, मैं हमेशा 2 पुस्तकालयों (mylibrary.so और libC++ _ shared.so साथ समापन) मेरे आउटपुट फ़ोल्डर में, जिससे ऐप में एक साथ बंडल हो गया। ऐसा लगता है कि सीएमके टूलचेन libC++ _ shared.so बंडल नहीं कर रहा है (वास्तव में, यह एपीके में नहीं मिला है)।

मैं 6 घंटे के लिए इस पर अपने सिर को टक्कर लगी हूं। क्या मैं किसी भी तरह से इस लापता पुस्तकालय को बंडल करने के लिए सीएमके टूलचैन प्राप्त कर सकता हूं? कोई सुराग?

मेरी सेटिंग्स:

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) 
+1

यह एंड्रॉइड स्टूडियो सीएमके एकीकरण में एक ज्ञात मुद्दा है: https://code.google.com/p/android/issues/detail?id=214664 –

+1

आप यह देखने का प्रयास कर सकते हैं कि यह एक है: https://github.com/googlesamples/android-ndk/pull/298 आपके लिए काम कर सकता है। ऐसा करने के लिए और भी कुछ हो सकता है, यह देखने का प्रयास करें कि क्या यह – Gerry

+0

पल के लिए आपकी मदद कर सकता है धन्यवाद @ गेरी जो वास्तव में काम करता है। मैं इस धागे के वैकल्पिक उत्तर में किए गए परिवर्तनों को तैयार कर सकता हूं .. :-) – Mete

उत्तर

5

मैं एक CMake config लिखा था जो एसटीएल फाइलों को पैकेज करना चाहिए: https://github.com/jomof/ndk-stl/blob/master/ndk-stl-config.cmake

कॉपी इस फाइल को अपने CMakeLists.txt के बगल में और CMakeLists.txt अंदर

शामिल (NDK-STL-config.cmake)

मुझे पता है यदि आप समस्याओं

+0

धन्यवाद आदमी, मुझे इसकी तलाश पसंद है लेकिन त्रुटि में चलते रहें 'ndk-stl "द्वारा प्रदान की गई पैकेज कॉन्फ़िगरेशन फ़ाइल नहीं मिली '- मैंने पैथ बदलने की कोशिश की "।" पैथ $ {CMAKE_CURRENT_LIST_DIR} तक लेकिन अभी भी कोई भाग्य नहीं है। इस दौरान प्रयास करना जारी रखेगा ... – Mete

+0

नोट, हालांकि मुझे समस्या के लिए एक और कामकाज मिला, मुझे लगता है कि अगर यह काम करता है तो आपका आसान और अधिक पोर्टेबल लगता है, इसलिए अगर हम यह पता लगा सकते हैं कि पथ – Mete

+0

जारी हैं तो मैं आपको जवाब दूंगा संदेश का मतलब है कि सीएमके पैकेज फ़ाइल ndk-stl-config.cmake का पता नहीं लगा सका। क्या आपने फ़ाइल ndk-stl-config.cmake नाम दिया है और इसे अपने CMakeLists.txt के आगे रखें? यदि हां, तो हमम, दो विचार: (1) जीथ्यूब पर मेरे साथ एक रेपो प्रोजेक्ट साझा करें, (2) आपके द्वारा प्राप्त पूरा संदेश पेस्ट करें (./gradlew कमांड लाइन पर इकट्ठा करें) –

1

है गेरी के रूप में बताया करते हैं , ऑडियो-इको नमूना प्रोजेक्ट में नवीनतम परिवर्तन (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 को बदलने के लिए।

0

बस अपने आवेदन में

APP_STL := c++_shared 

शामिल हैं।एमके