Không thể bao gồm các tiêu đề C ++ như vectơ trong Android NDK


83

Khi tôi cố gắng đưa bất kỳ lớp C ++ nào như vectơ vào dự án Android NDK của mình (sử dụng NDK r5b, phiên bản mới nhất), tôi gặp lỗi như sau ...

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

Những người khác đã báo cáo vấn đề này trực tuyến đã tuyên bố thành công bằng cách thêm

APP_STL := stlport_static

vào tệp Application.mk của họ. Tôi đã làm điều này cũng như thử mọi giá trị có thể có khác cho APP_STL. Tôi đã dọn dẹp dự án, chạy ndk-build sạch, xóa các thư mục obj và libs, và khi tôi biên dịch nó vẫn không thể tìm thấy lớp vector. Tôi đã làm việc này trong vài tuần nay (kể từ khi NDK r5 ra mắt) và sẽ thực sự đánh giá cao nếu ai đó có bất kỳ lời khuyên nào. Cảm ơn!


2
Trước hết, hãy kiểm tra thư mục android-ndk-r5 \ build \ platform \ android- X\ Arch-arm \ usr \ include - có vectorthực sự ở đó không?
Seva Alekseyev

2
Không có nó không phải là! Tôi không biết nhiều về cách NDK hoạt động ngoài việc sử dụng JNI và biên dịch các nguồn. Làm cách nào để tôi có được vectơ ở đó? Tôi thấy vectơ trong android-ndk-r5b / sources / cxx-stl / stlport / stlport nếu điều đó có nghĩa là gì. Cảm ơn vì đã trả lời nhanh chóng và tôi thực sự đánh giá cao nó!
Nitrex88

2
@seva Vì vậy, tôi đã thử chạy một loạt các công cụ để xây dựng lại chuỗi công cụ và các bản dựng sẵn (tệp .sh trong thư mục công cụ của NDK) và vẫn không thể làm cho tiêu đề STL hoạt động. Nếu tôi tải xuống NDK mới từ trang web Android thì không phải mọi thứ đều hoạt động? Tôi đã thử và tải xuống mới không thay đổi bất cứ điều gì. Bất kỳ cái nhìn sâu sắc hơn về vấn đề bạn có thể cung cấp?
Nitrex88

[đây là cách tôi định cấu hình STLPort để hoạt động với Android Froyo.] [1] [1]: stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelian

[đây là cách tôi định cấu hình STLPort để hoạt động với Android Froyo.] [1] [1]: stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelian

Câu trả lời:


121

Điều đó là có thể. Dưới đây là một số bước:

Trong $ PROJECT_DIR / jni / Application.mk :

APP_STL                 := stlport_static

Tôi đã thử sử dụng stlport_shared, nhưng không may mắn. Tương tự với libstdc ++.

Trong $ 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)

Không có gì đặc biệt ở đây, nhưng hãy đảm bảo tệp của bạn là .cpp .

Trong $ PROJECT_DIR / jni / hello-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

Thứ duy nhất khiến tôi cắn ở đây là #ifdef __cplusplus.

Xem các thư mục.

Để biên dịch, sử dụng ndk-build clean && ndk-build.


5
Cảm ơn cảm ơn!! Cuối cùng bạn đã giải quyết được vấn đề của tôi. Hóa ra tôi đã đặt Application.mk của mình không đúng chỗ! Tôi đã có nó trong thư mục dự án nhưng không có trong thư mục JNI (tôi không chắc tại sao nhưng kể từ khi tôi bắt đầu phát triển Android, tôi luôn nghĩ rằng nó đã đến đó). Nhìn thấy bạn đặt đường dẫn của Application.mk trong thư mục jni khiến tôi nhận ra. Cảm ơn và bạn sẽ nhận được tiền thưởng!
Nitrex88

2
Chỉ cần tạo Application.mk cần thiết đã giải quyết được nó, nhưng tôi thấy thông báo Android NDK: You might want to use $NDK/build/tools/build-stlport.sh. LƯU Ý: điều này không hoạt động dưới cygwin
Ai đó ở đâu đó

xin chào, tôi có thể xây dựng ứng dụng sử dụng vector.
CoDe 29/02/12

xin chào, tôi đã thêm APP_STL: = stlport_static vào tệp Application.mk và nó đang hoạt động cho ứng dụng của tôi nhưng cùng một ứng dụng mà tôi đưa vào Nguồn Android, đây là lỗi "không tìm thấy lớp vectơ .." trong khi biên dịch mã. xin đề nghị cho tôi bất kỳ ai có ý tưởng về nó.
CoDe 29/02/12

1
Có lẽ bạn có thể tải một mẫu dự án của mình lên github và chia sẻ URL, sau đó chúng ta có thể xem xét.
Sebastian Roth,

20

Nếu bạn đang sử dụng Android studio và bạn vẫn thấy thông báo "error: vector: Không có tệp hoặc thư mục như vậy" (hoặc các lỗi liên quan đến stl khác) khi bạn đang biên dịch bằng ndk, thì điều này có thể giúp ích cho bạn.

Trong dự án của bạn, hãy mở tệp build.gradle của mô-đun (không phải tệp build.grade của dự án, mà là tệp dành cho mô-đun của bạn) và thêm 'stl "stlport_shared"' trong phần tử ndk trong defaultConfig.

Ví dụ:

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
Tại sao stlport_sharedvà không stlport_static?
IgorGanapolsky

9

Tôi đang sử dụng Android Studio và kể từ ngày 19 tháng 1 năm 2016, điều này đã thành công với tôi. (Điều này có vẻ giống như một cái gì đó thay đổi hàng năm hoặc lâu hơn)

Đi tới: app -> Gradle Scripts -> build.gradle (Module: app)

Sau đó, trong mô hình {... android.ndk {... và thêm một dòng: stl = "gnustl_shared"

Như thế này:

model {

    ...

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

    ...

}

Này, tôi đang gặp sự cố này với ffmpeg, thực sự bản dựng ndk đang hoạt động tốt và nó tạo thành công các tệp .so nhưng tệp tiêu đề bị thiếu. Bạn có ý kiến ​​gì về điều đó không? (Tôi đang sử dụng studio android với plugin thử nghiệm gradle)
Pushpendra

Đó là với plugin thử nghiệm gradle?
Sebastian Roth

Tại sao gnustl_sharedthay vì gnustl_static?
IgorGanapolsky,

Hoạt động, tôi đoán điều này nên được chọn làm câu trả lời.
Vishnudev K

Tôi đã thử điều này với Android Studio 2.1.3 mới nhất và nó dường như không hoạt động. Để kiểm tra, tôi đã sử dụng ứng dụng mẫu HelloJNI, đổi tên hello-jni.c thành .cpp và thêm #include <vector> vào nó. Tôi gặp lỗi: fatal error: 'vector' file not found #include <vector>Có bất kỳ bước bổ sung nào cần thiết sau khi thêm stl = "gnustl_static" hoặc "gnustl_shared" vào tệp gradle của mô-đun không?
SideLobe

4

Ngay cả Sebastian đã đưa ra một câu trả lời tốt ở đó 3 năm trước, tôi vẫn muốn chia sẻ một trải nghiệm mới ở đây, phòng trường hợp bạn sẽ gặp phải vấn đề giống tôi trong phiên bản ndk mới.

Tôi có lỗi biên dịch như:

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

Môi trường của tôi là android-ndk-r9d và adt-pack-linux-x86_64-20140702. Tôi thêm tệp Application.mk trong cùng một thư mục jni và chèn một (và chỉ một) dòng:

APP_STL := stlport_static

Nhưng thật không may, nó không giải quyết được vấn đề của tôi! Tôi phải thêm 3 dòng này vào Android.mk để giải quyết nó:

ifndef NDK_ROOT
include external/stlport/libstlport.mk
endif

Và tôi đã thấy một chia sẻ tốt từ đây nói rằng "'stlport_shared' được ưu tiên hơn". Vì vậy, có lẽ đó là một giải pháp tốt hơn để sử dụng stlport như một thư viện được chia sẻ thay vì tĩnh. Chỉ cần thêm các dòng sau vào Android.mk và sau đó không cần thêm tệp Application.mk.

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

Hy vọng điều này là hữu ích.


Chỉ để rõ ràng, khi bạn nói "cùng một thư mục jni", bạn đang đề cập đến thư mục jni của dự án android? Tôi muốn chắc chắn rằng không có vị trí nào khác mà tôi nên biết. lưu ý bên: liên kết chia sẻ tốt đó hiện đã chết :(
Hunter-Orionnoir,

4

Hãy để tôi thêm một chút vào câu trả lời của Sebastian Roth.

Dự án của bạn có thể được biên dịch bằng cách sử dụng ndk-buildtrong dòng lệnh sau khi thêm mã mà Sebastian đã đăng. Nhưng đối với tôi, có lỗi cú pháp trong Eclipse và tôi không hoàn thành mã.

Lưu ý rằng dự án của bạn phải được chuyển đổi thành dự án C / C ++.

Cách chuyển đổi một dự án C / C ++

Để khắc phục sự cố này, hãy nhấp chuột phải vào dự án của bạn, nhấp vào Thuộc tính

Chọn C / C ++ chung -> Paths và biểu tượng và bao gồm ${ANDROID_NDK}/sources/cxx-stl/stlport/stlportđể Bao gồm danh bạ

Bấm khi hộp thoại xuất hiện.

Hộp thoại

Trước

Trước

Sau

Sau

Cập nhật # 1

GNU C. Thêm thư mục, xây dựng lại. Sẽ không có bất kỳ sai sót trong C file nguồn
GNU C ++. Thêm thư mục, xây dựng lại. Sẽ không có bất kỳ lỗi nào trong các tệp nguồn CPP .


3

Nếu bạn đang sử dụng ndk r10c trở lên, chỉ cần thêm APP_STL = c ++ _ static vào Application.mk


1

Đây là nguyên nhân gây ra sự cố trong trường hợp của tôi ( CMakeLists.txt):

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

Nó làm cho tất cả các thư mục được định nghĩa trước đó trở nên vô hình. Sau khi loại bỏ / cấu trúc lại dòng này, mọi thứ hoạt động tốt.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.