Android NDK में वेक्टर जैसे C ++ हेडर शामिल नहीं कर सकते


83

जब मैं अपने एंड्रॉइड NDK प्रोजेक्ट (NDK r5b, नवीनतम का उपयोग करके) में वेक्टर जैसी किसी भी C ++ क्लास को शामिल करने की कोशिश करता हूं, तो मुझे निम्न जैसी त्रुटि मिलती है ...

Compile++ thumb : test-libstl <= test-libstl.cpp /Users/nitrex88/Desktop/Programming/EclipseProjects/STLTest/jni/test-libstl.cpp:3:18: error: vector: No such file or directory

अन्य लोग जिन्होंने इस मुद्दे को ऑनलाइन रिपोर्ट किया है, उन्होंने जोड़कर सफलता का दावा किया है

APP_STL := stlport_static

उनके Application.mk फ़ाइल के लिए। मैंने ऐसा किया है और साथ ही APP_STL के लिए हर दूसरे मुमकिन कोशिश की है। मैंने प्रोजेक्ट करने के लिए साफ़ किया है, ndk-build क्लीन रन किया है, obj और libs फ़ोल्डरों को डिलीट किया है, और फिर भी जब मैं संकलित करता हूं तो यह वेक्टर क्लास नहीं ढूंढ सकता। मैं कई हफ्तों से इस पर काम कर रहा हूं (जब से NDK r5 सामने आया है) और अगर किसी की कोई सलाह है तो वास्तव में सराहना करेंगे। धन्यवाद!


2
सबसे पहले, android-ndk-r5 \ build \ platform \ android- X\ arch-arm \ usr \ को चेक करें जिसमें डायरेक्टरी शामिल हो - क्या vectorवास्तव में है?
सेवा अलेक्सेयेव

2
नहीं ऐसा नहीं है! मुझे इस बारे में ज्यादा जानकारी नहीं है कि NDK जेएनआई का उपयोग करने और स्रोतों को संकलित करने से परे कैसे काम करता है। मैं वेक्टर कैसे हो सकता हूं? मैं Android-ndk-r5b / स्रोतों / cxx-stl / stlport / stlport में वेक्टर देखता हूं अगर इसका कोई मतलब है। त्वरित उत्तर के लिए धन्यवाद और मैं वास्तव में इसकी सराहना करता हूं!
नाइट्रिक्स88

2
@seva तो मैंने टूलचिन और प्रीबिल्ट्स के पुनर्निर्माण के लिए उपकरणों का एक गुच्छा चलाने की कोशिश की (.sh फ़ाइलें int वह NDK के उपकरण फ़ोल्डर) और फिर भी एसटीएल हेडर काम नहीं कर सका। अगर मैं एंड्रॉइड साइट से ताज़ा एनडीके डाउनलोड करता हूं तो क्या सब कुछ बस काम नहीं करना चाहिए? मैंने कोशिश की और ताजा डाउनलोड कुछ भी नहीं बदलता है। मामले में किसी भी अधिक जानकारी आप की पेशकश कर सकते हैं?
21

[यह है कि मैंने एंड्रॉइड फ्रायो के साथ काम करने के लिए STLPort को कैसे कॉन्फ़िगर किया है।] [1] [१]: stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelle

[यह है कि मैंने एंड्रॉइड फ्रायो के साथ काम करने के लिए STLPort को कैसे कॉन्फ़िगर किया है।] [1] [१]: stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelle

जवाबों:


121

हो सकता है। यहाँ कुछ कदम से कदम है:

में $ PROJECT_DIR / JNI / Application.mk :

APP_STL                 := stlport_static

मैंने stlport_sared का उपयोग करने की कोशिश की, लेकिन कोई भाग्य नहीं। Libstdc ++ के साथ भी।

में $ PROJECT_DIR / JNI / Android.mk :

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.cpp
LOCAL_LDLIBS    := -llog

include $(BUILD_SHARED_LIBRARY)

यहां कुछ खास नहीं है, लेकिन सुनिश्चित करें कि आपकी फाइलें .cpp हैं

में $ PROJECT_DIR / JNI / हैलो-jni.cpp :

#include <string.h>
#include <jni.h>
#include <android/log.h>

#include <iostream>
#include <vector>


#define  LOG_TAG    "hellojni"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)


#ifdef __cplusplus
extern "C" {
#endif

// Comments omitted.    
void
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    std::vector<std::string> vec;

    // Go ahead and do some stuff with this vector of strings now.
}

#ifdef __cplusplus
}
#endif

केवल एक चीज जो मुझे यहाँ काटती है वह थी #ifdef __cplusplus।

निर्देशिका देखें।

संकलन करने के लिए, का उपयोग करें ndk-build clean && ndk-build


5
शुक्रिया शुक्रिया!! आपने आखिरकार मेरी समस्या हल कर दी। पता चलता है कि मैं गलत जगह में मेरा Application.mk था! मेरे पास यह प्रोजेक्ट फ़ोल्डर में था, लेकिन जेएनआई फ़ोल्डर में नहीं (मुझे यकीन नहीं है, लेकिन जब से मैंने एंड्रॉइड डेवलपमेंट शुरू किया तो मुझे लगा कि यह हमेशा चला गया है)। देखकर आपने jn फोल्डर में Application.mk का रास्ता डाल दिया, जिससे मुझे एहसास हुआ। धन्यवाद और आप इनाम मिलता है!
18

2
बस आवश्यक Application.mk बनाने से इसे हल किया गया, लेकिन मैं संदेश देखता हूं Android NDK: You might want to use $NDK/build/tools/build-stlport.sh। नोट: यह cygwin के तहत काम नहीं किया
किसी ने

हैलो, मैं एप्लिकेशन का निर्माण करने में सक्षम हूं जो वेक्टर का उपयोग कर रहा है।
CoDe

हैलो, मैंने APP_STL को जोड़ा: = stlport_static में Application.mk फ़ाइल और यह मेरे आवेदन के लिए काम कर रहा है, लेकिन उसी एप्लिकेशन को मैं एंड्रॉइड सोर्स में शामिल करता हूं, यहां यह मुझे कोड संकलित करने के दौरान "वेक्टर वर्ग नहीं मिला .." त्रुटि दे रहा है। pls मुझे सुझाव है कि किसी को भी इसके बारे में विचार है।
CoDe

1
शायद आप अपने प्रोजेक्ट का एक नमूना जीथब में अपलोड कर सकते हैं और URL साझा कर सकते हैं, तो हम देख सकते हैं।
सेबस्टियन रोथ

20

यदि आप एंड्रॉइड स्टूडियो का उपयोग कर रहे हैं और आप अभी भी "त्रुटि: वेक्टर: ऐसी कोई फ़ाइल या निर्देशिका" (या अन्य stl संबंधित त्रुटियों) के संदेश को देख रहे हैं, जब आप ndk का उपयोग कर संकलन कर रहे हैं, तो यह आपकी मदद कर सकता है।

अपनी परियोजना में, मॉड्यूल की build.gradle फ़ाइल खोलें (आपकी परियोजना के build.grad नहीं, लेकिन वह जो आपके मॉड्यूल के लिए है) और डिफ़ॉल्टकॉन्फ़िग में ndk तत्व के भीतर 'stl "stlport_sared" जोड़ें "।

उदाहरण के लिए:

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.domain.app"
        minSdkVersion 15
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"

        ndk {
            moduleName "myModuleName"
            stl "stlport_shared"
        }
    }
}

1
क्यों stlport_sharedऔर क्या नहीं stlport_static?
इगोरगानापोलस्की

9

मैं एंड्रॉइड स्टूडियो का उपयोग कर रहा हूं और 19 जनवरी 2016 तक मेरे लिए यह चाल चली। (यह कुछ ऐसा है जो हर साल बदलता है)

पर जाएं: ऐप -> ग्रेडेल लिपियों -> build.gradle (मॉड्यूल: ऐप)

फिर मॉडल के तहत {... android.ndk {... और एक पंक्ति जोड़ें: stl = "gnustl_sared"

इस कदर:

model {

    ...

    android.ndk {
        moduleName = "gl2jni"
        cppFlags.add("-Werror")
        ldLibs.addAll(["log", "GLESv2"])
        stl = "gnustl_shared"     //  <-- this is the line that I added
    }

    ...

}

अरे मैं ffmpeg के साथ इस समस्या को प्राप्त कर रहा हूं, वास्तव में ndk बिल्ड ठीक काम कर रहा है और इसकी सफलतापूर्वक उत्पन्न .so फाइलें लेकिन हेडर फाइलें गायब हैं क्या आपको इसके बारे में कोई विचार है? (मैं एंड्रॉइड स्टूडियो को ग्रेडेल प्रायोगिक प्लगइन के साथ उपयोग कर रहा हूं)
पुष्पेंद्र

यह gradle-प्रयोगात्मक प्लगइन के साथ है?
सेबेस्टियन रोथ

gnustl_sharedइसके बजाय क्यों gnustl_static?
इगोरगानापल्स्की 13

वर्क्स, मुझे लगता है कि यह उत्तर के रूप में चुना जाना चाहिए।
विष्णुदेव के।

मैंने सबसे हाल के एंड्रॉइड स्टूडियो 2.1.3 के साथ यह कोशिश की और यह काम नहीं करता है। इसका परीक्षण करने के लिए, मैंने HelloJNI नमूना आवेदन लिया, जिसका नाम hello-jni.c .cpp रखा और इसमें एक #include <वेक्टर> जोड़ा। मुझे त्रुटि मिलती है: fatal error: 'vector' file not found #include <vector>क्या मॉड्यूल की फ़ाइल में stl = "gnustl_static" या "gnustl_sared" जोड़ने के बाद कोई अतिरिक्त कदम आवश्यक हैं?
साइडलोब

4

यहां तक ​​कि 3 साल पहले भी सेबेस्टियन ने एक अच्छा जवाब दिया था, मैं अभी भी यहां एक नया अनुभव साझा करना चाहता हूं, यदि आप मेरे लिए नए ndk संस्करण में भी समान समस्या का सामना करेंगे।

मेरे पास संकलन त्रुटि है जैसे:

fatal error: map: No such file or directory
fatal error: vector: No such file or directory

मेरा वातावरण android-ndk-r9d और adt-bundle-linux-x86_64-20140702 है। मैं एक ही जेनी फ़ोल्डर में Application.mk फ़ाइल जोड़ता हूं और एक (और केवल एक) लाइन सम्मिलित करता हूं:

APP_STL := stlport_static

लेकिन दुर्भाग्य से, यह मेरी समस्या को हल नहीं करता है! मुझे इन 3 लाइनों को हल करने के लिए Android.mk में जोड़ना है:

ifndef NDK_ROOT
include external/stlport/libstlport.mk
endif

और मैंने यहाँ से एक अच्छी साझेदारी देखी जो कहती है कि "'stlport_sared' को प्राथमिकता दी जाती है"। तो शायद स्थैतिक के बजाय एक साझा पुस्तकालय के रूप में स्टालपोर्ट का उपयोग करना बेहतर उपाय है। बस निम्नलिखित पंक्तियों को Android.mk में जोड़ें और फिर फ़ाइल Application.mk को जोड़ने की आवश्यकता नहीं है।

ifndef NDK_ROOT
include external/stlport/libstlport.mk
endif
LOCAL_SHARED_LIBRARIES += libstlport

आशा है कि यह उपयोगी है।


बस स्पष्ट होने के लिए, जब आप कहते हैं "उसी जेनी फ़ोल्डर" आप एंड्रॉइड प्रोजेक्ट के जेनी फ़ोल्डर का उल्लेख कर रहे हैं? मैं यह सुनिश्चित करना चाहता हूं कि कोई अन्य स्थान नहीं है जिसके बारे में मुझे पता होना चाहिए। साइड नोट: वह अच्छा शेयरिंग लिंक अब मर चुका है :(
हंटर-ओरियनोयर

4

मुझे सेबस्टियन रोथ के जवाब में थोड़ा जोड़ना चाहिए

ndk-buildसेबस्टियन द्वारा पोस्ट किए गए कोड को जोड़ने के बाद कमांड लाइन में उपयोग करके आपके प्रोजेक्ट को संकलित किया जा सकता है । लेकिन मेरे लिए, ग्रहण में सिंटैक्स त्रुटियां थीं, और मेरे पास कोड पूरा नहीं था।

ध्यान दें कि आपका प्रोजेक्ट C / C ++ प्रोजेक्ट में कनवर्ट होना चाहिए।

C / C ++ प्रोजेक्ट को कैसे कन्वर्ट करें

इस समस्या को ठीक करने के लिए अपनी परियोजना पर राइट-क्लिक करें, गुण क्लिक करें

चुनें C / C ++ जनरल > - पथ और प्रतीकों और शामिल ${ANDROID_NDK}/sources/cxx-stl/stlport/stlportकरने के लिए निर्देशिका को शामिल करें

जब कोई संवाद दिखाई दे, तो हां पर क्लिक करें ।

संवाद

इससे पहले

इससे पहले

उपरांत

उपरांत

अपडेट # 1

GNU C. निर्देशिका जोड़ें, पुनर्निर्माण करें। ग्नू सी ++ में सी स्रोत फ़ाइलों में कोई त्रुटि नहीं होगी
निर्देशिकाएं जोड़ें, पुनर्निर्माण करें। CPP स्रोत फ़ाइलों में कोई त्रुटि नहीं होगी ।


3

यदि आप ndk r10c का उपयोग कर रहे हैं या बाद में, बस APP_STL = c ++ _ static को Application.mk में जोड़ें


1

यह मेरे मामले में समस्या का कारण है ( CMakeLists.txt):

set (CMAKE_CXX_FLAGS "...some flags...")

यह अदृश्य को पहले से परिभाषित सभी निर्देशिकाओं में शामिल करता है। इस लाइन को हटाने / रिफैक्ट करने के बाद सब कुछ ठीक काम करता है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.