2

나는 protobuf-lite를 기본 라이브러리와 함께 사용하는 공유 라이브러리를 만들려고합니다. 나는 주위를 수색했는데 Windows를 사용하는 동안 Android Studio 3, google protobuf-lite 및 Android NDK와 관련된 항목을 찾을 수 없습니다. 나는 다른 사람이 내가하고있는 똑같은 일을 시도해야한다는 것을 알고 있지만, 나의 구체적인 것은 내가 읽은 것에서는 분명하지 않다.안드로이드 NDK 정의되지 않은 참조 구글 protobuf

나는 실행 해요 :

  • 윈도우 10 64 비트
  • 안드로이드 스튜디오 3.0.1
  • 안드로이드 NDK R16
  • protobuf - 라이트 버전 3.0.0
  • 그리고 armeabi 대상 -v7a

libprotobuf-lite.so를 만들기 위해 DOCKER 파일을 사용했습니다. 사용하고 있습니다. 고정 표시기의 FILE :

FROM debian:stretch 

    ENV ANDROID_NDK_HOME /build/android-ndk 
    ENV ANDROID_NDK_VERSION=r16 

    RUN set -e -x && \ 
    apt-get update && \ 
    apt-get install -y \ 
    unzip \ 
    wget 

    #ADD android-ndk-${ANDROID_NDK_VERSION}-linux-x86_32.zip /build/android- 
    ndk.zip 
    RUN set -e -x && \ 
    mkdir /build && \ 
    cd /build && \ 
    wget -q https://dl.google.com/android/repository/android- 
    ndk-${ANDROID_NDK_VERSION}-linux-x86_32.zip -O android-ndk.zip && \ 
    unzip -q android-ndk.zip && \ 
    mv ./android-ndk-${ANDROID_NDK_VERSION} ${ANDROID_NDK_HOME} && \ 
    rm android-ndk.zip 

    #ADD protobuf-cpp-3.0.0.zip /build/protobuf.zip 
    RUN set -e -x && \ 
    cd /build && \ 
    wget -q 
    https://github.com/google/protobuf/releases/download/v3.0.0/protobuf-cpp- 
    3.0.0.zip -O protobuf-src.zip && \ 
    unzip protobuf-src.zip && \ 
    mv protobuf-3.0.0 protobuf && \ 
    rm protobuf-src.zip 

    RUN set -e -x && \ 
    cd /build && \ 
    wget -q 
    https://github.com/google/protobuf/releases/download/v3.0.0/protoc-3.0.0- 
    linux-x86_32.zip -O protoc.zip && \ 
    mkdir protoc && \ 
    cd protoc && \ 
    unzip ../protoc.zip && \ 
    cd .. && \ 
    rm protoc.zip 

    RUN set -e -x && \ 
    apt-get update && \ 
    apt-get install -y \ 
    # protobuf compile 
    autoconf \ 
    automake \ 
    libtool \ 
    curl \ 
    make \ 
    g++ \ 
    # additional compile not in readme 
    libncurses5-dev \ 
    # make_standalone_toolchain 
    python \ 
    # util 
    nano 

    RUN /build/android-ndk/build/tools/make_standalone_toolchain.py \ 
    --arch arm \ 
    --install-dir /build/android-arm 

    ADD build.sh /build 
    WORKDIR /build/protobuf 


    CMD /bin/bash 

나는 C를 쓰고 있어요 ++ 라이브러리는 자바 측에서 사용할 수 있습니다. Android Studio에서 기본 라이브러리를 작성하는 데 사용하는 Android.mk 파일이 있습니다.

Android.mk 파일 :

LOCAL_PATH := $(call my-dir) 

    include $(CLEAR_VARS) 
    LOCAL_MODULE := protobuf-lite 
    LOCAL_SRC_FILES := libprotobuf-lite.so 
    LOCAL_CFLAGS := -std=c++11 
    include $(PREBUILT_SHARED_LIBRARY) 

    include $(CLEAR_VARS) 
    LOCAL_MODULE := native-lib 
    LOCAL_SRC_FILES := native-lib.cpp \ 
     BeaconSearchResult.cpp \ 
     fileformat.pb.cc \ 
     Geopoint.cpp \ 
     Location.cpp \ 
     osmformat.pb.cc \ 
     osmpbf.cpp \ 
     OSMPBFread.cpp \ 
     OSMPOISearch.cpp \ 
     POI.cpp \ 
    TARGET_ARCH_ABI := armeabi-v7a 
    LOCAL_LDFLAGS := -lz -llog 
    LOCAL_SHARED_LIBRARIES := libprotobuf-lite 
    LOCAL_CPP_FEATURES := rtti 
    LOCAL_CFLAGS := -std=c++11 
    include $(BUILD_SHARED_LIBRARY) 

오류 I 수 있습니다

Error:(511) undefined reference to 'google::protobuf::internal::MergeFromFail(char const*, int)' 
    Error:(521) undefined reference to 'google::protobuf::internal::ArenaStringPtr::AssignWithDefault(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const*, google::protobuf::internal::ArenaStringPtr)' 
    Error:(237) undefined reference to 'google::protobuf::io::LazyStringOutputStream::LazyStringOutputStream(google::protobuf::ResultCallback<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >*>*)' 
    Error:(377) undefined reference to 'google::protobuf::io::LazyStringOutputStream::~LazyStringOutputStream()' 
    Error:(390) undefined reference to 'google::protobuf::internal::WireFormatLite::WriteString(int, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::all 
    Error:(817) undefined reference to 'google::protobuf::io::CodedOutputStream::VarintSize64(unsigned long long)' 
    Error:(830) undefined reference to 'google::protobuf::Arena::AddListNode(void*, void (*)(void*))' 
    Error:(640) undefined reference to 'google::protobuf::Arena::AllocateAligned(std::type_info const*, unsigned int)' 

그리고 그 오류는 파일에 나타납니다

  • osmformat.pb.cc
  • protobuf/wire_format_lite_inl.h
  • ,210
  • protobuf/49 개의 오차가 총

  • protobuf/generated_message_util.h
  • 및 fileformat.pb.cc arena.h. 내가 LOCAL_SHARED_LIBRARIES 인 Android.mk의 줄을 꺼내면 159 개의 오류가 발생하기 때문에 내가하고있는 일이 정확해야한다는 것을 알고 있습니다. 나는 지혜의 끝자락에있어. 그리고 나는 이것에 관해 신선한 눈을 정말로 사용할 수 있었다. 더 자세한 정보가 필요하면 알려주십시오.

    편집 :

    FAILURE: Build failed with an exception. 
    
        * What went wrong: 
        Execution failed for task ':app:externalNativeBuildDebug'. 
        > Build command failed. 
        Error while executing process C:\Users\jkarr\AppData\Local\Android\Sdk\ndk-bundle\ndk-build.cmd with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=C:\Users\jkarr\Hellocmake\app\src\main\jni\armeabi-v7a\Android.mk NDK_APPLICATION_MK=C:\Users\jkarr\Hellocmake\app\src\main\jni\armeabi-v7a\Application.mk APP_ABI=armeabi-v7a NDK_ALL_ABIS=armeabi-v7a NDK_DEBUG=1 APP_PLATFORM=android-15 NDK_OUT=C:/Users/jkarr/Hellocmake/app/build/intermediates/ndkBuild/debug/obj NDK_LIBS_OUT=C:\Users\jkarr\Hellocmake\app\build\intermediates\ndkBuild\debug\lib C:/Users/jkarr/Hellocmake/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/libnative-lib.so} 
        Android NDK: WARNING: Unsupported source file extensions in C:\Users\jkarr\Hellocmake\app\src\main\jni\armeabi-v7a\Android.mk for module native-lib  
        Android NDK: TARGET_ARCH_ABI := armeabi-v7a 
        [armeabi-v7a] SharedLibrary : libnative-lib.so 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:512: error: undefined reference to 'google::protobuf::internal::MergeFromFail(char const*, int)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:522: error: undefined reference to 'google::protobuf::internal::ArenaStringPtr::AssignWithDefault(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const*, google::protobuf::internal::ArenaStringPtr)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:526: error: undefined reference to 'google::protobuf::internal::ArenaStringPtr::AssignWithDefault(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const*, google::protobuf::internal::ArenaStringPtr)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:536: error: undefined reference to 'google::protobuf::internal::ArenaStringPtr::AssignWithDefault(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const*, google::protobuf::internal::ArenaStringPtr)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/google/include/protobuf/arena.h:830: error: undefined reference to 'google::protobuf::Arena::AddListNode(void*, void (*)(void*))' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:238: error: undefined reference to 'google::protobuf::io::LazyStringOutputStream::LazyStringOutputStream(google::protobuf::ResultCallback<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >*>*)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:378: error: undefined reference to 'google::protobuf::io::LazyStringOutputStream::~LazyStringOutputStream()' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:391: error: undefined reference to 'google::protobuf::internal::WireFormatLite::WriteString(int, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&, google::protobuf::io::CodedOutputStream*)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:397: error: undefined reference to 'google::protobuf::internal::WireFormatLite::WriteString(int, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&, google::protobuf::io::CodedOutputStream*)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:403: error: undefined reference to 'google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(int, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&, google::protobuf::io::CodedOutputStream*)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:409: error: undefined reference to 'google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(int, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&, google::protobuf::io::CodedOutputStream*)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:425: error: undefined reference to 'google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(int, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&, google::protobuf::io::CodedOutputStream*)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/google/include/protobuf/wire_format_lite_inl.h:817: error: undefined reference to 'google::protobuf::io::CodedOutputStream::VarintSize64(unsigned long long)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:1267: error: undefined reference to 'google::protobuf::internal::MergeFromFail(char const*, int)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/google/include/protobuf/arena.h:830: error: undefined reference to 'google::protobuf::Arena::AddListNode(void*, void (*)(void*))' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:1069: error: undefined reference to 'google::protobuf::io::LazyStringOutputStream::LazyStringOutputStream(google::protobuf::ResultCallback<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >*>*)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:1159: error: undefined reference to 'google::protobuf::io::LazyStringOutputStream::~LazyStringOutputStream()' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/google/include/protobuf/wire_format_lite_inl.h:829: error: undefined reference to 'google::protobuf::io::CodedOutputStream::VarintSize64(unsigned long long)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:1760: error: undefined reference to 'google::protobuf::internal::MergeFromFail(char const*, int)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/google/include/protobuf/arena.h:830: error: undefined reference to 'google::protobuf::Arena::AddListNode(void*, void (*)(void*))' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:1534: error: undefined reference to 'google::protobuf::io::LazyStringOutputStream::LazyStringOutputStream(google::protobuf::ResultCallback<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >*>*)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:1654: error: undefined reference to 'google::protobuf::io::LazyStringOutputStream::~LazyStringOutputStream()' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:2712: error: undefined reference to 'google::protobuf::internal::MergeFromFail(char const*, int)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/google/include/protobuf/arena.h:830: error: undefined reference to 'google::protobuf::Arena::AddListNode(void*, void (*)(void*))' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:2104: error: undefined reference to 'google::protobuf::io::LazyStringOutputStream::LazyStringOutputStream(google::protobuf::ResultCallback<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >*>*)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:2213: error: undefined reference to 'google::protobuf::io::LazyStringOutputStream::~LazyStringOutputStream()' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:2639: error: undefined reference to 'google::protobuf::internal::WireFormatLite::ReadBytes(google::protobuf::io::CodedInputStream*, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >*)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/osmformat.pb.cc:2676: error: undefined reference to 'google::protobuf::internal::WireFormatLite::WriteBytes(int, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&, google::protobuf::io::CodedOutputStream*)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/google/include/protobuf/wire_format_lite_inl.h:544: error: undefined reference to 'google::protobuf::io::CodedOutputStream::WriteVarint64(unsigned long long)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/google/include/protobuf/wire_format_lite_inl.h:544: error: undefined reference to 'google::protobuf::io::CodedOutputStream::WriteVarint64(unsigned long long)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/google/include/protobuf/wire_format_lite_inl.h:544: error: undefined reference to 'google::protobuf::io::CodedOutputStream::WriteVarint64(unsigned long long)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/google/include/protobuf/wire_format_lite_inl.h:544: error: undefined reference to 'google::protobuf::io::CodedOutputStream::WriteVarint64(unsigned long long)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/google/include/protobuf/arena.h:640: error: undefined reference to 'google::protobuf::Arena::AllocateAligned(std::type_info const*, unsigned int)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/google/include/protobuf/arena.h:640: error: undefined reference to 'google::protobuf::Arena::AllocateAligned(std::type_info const*, unsigned int)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/google/include/protobuf/arena.h:640: error: undefined reference to 'google::protobuf::Arena::AllocateAligned(std::type_info const*, unsigned int)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/google/include/protobuf/arena.h:640: error: undefined reference to 'google::protobuf::Arena::AllocateAligned(std::type_info const*, unsigned int)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/fileformat.pb.cc:372: error: undefined reference to 'google::protobuf::internal::ArenaStringPtr::AssignWithDefault(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const*, google::protobuf::internal::ArenaStringPtr)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/google/include/protobuf/generated_message_util.h:87: error: undefined reference to 'google::protobuf::internal::empty_string_' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/google/include/protobuf/generated_message_util.h:87: error: undefined reference to 'google::protobuf::internal::empty_string_' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/fileformat.pb.cc:188: error: undefined reference to 'google::protobuf::internal::WireFormatLite::ReadBytes(google::protobuf::io::CodedInputStream*, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >*)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/fileformat.pb.cc:216: error: undefined reference to 'google::protobuf::internal::WireFormatLite::ReadBytes(google::protobuf::io::CodedInputStream*, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >*)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/fileformat.pb.cc:229: error: undefined reference to 'google::protobuf::internal::WireFormatLite::ReadBytes(google::protobuf::io::CodedInputStream*, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >*)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/fileformat.pb.cc:278: error: undefined reference to 'google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased(int, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&, google::protobuf::io::CodedOutputStream*)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/fileformat.pb.cc:289: error: undefined reference to 'google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased(int, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&, google::protobuf::io::CodedOutputStream*)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/fileformat.pb.cc:295: error: undefined reference to 'google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased(int, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&, google::protobuf::io::CodedOutputStream*)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/fileformat.pb.cc:301: error: undefined reference to 'google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased(int, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&, google::protobuf::io::CodedOutputStream*)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/fileformat.pb.cc:852: error: undefined reference to 'google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(int, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&, google::protobuf::io::CodedOutputStream*)' 
        C:/Users/jkarr/Hellocmake/app/src/main/jni/armeabi-v7a/google/include/protobuf/io/coded_stream.h:1232: error: undefined reference to 'google::protobuf::io::CodedOutputStream::VarintSize32Fallback(unsigned int)' 
        clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation) 
        make: ***[C:/Users/jkarr/Hellocmake/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/libnative-lib.so] Error 1 
    
    
        * Try: 
        Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. 
    
        * Get more help at https://help.gradle.org 
    
        BUILD FAILED in 2s 
    
  • +0

    ** Android.mk **에서'TARGET_ARCH_ABI'를 덮어 쓰지 않으려는 경우 명령 행에서 빌드 할 때'APP_ABI'를, ** build.gradle **에서'abiFilters'를 설정할 수 있습니다. –

    +0

    그래, 난 아직도이게 새로운데. 사실 내 빌딩에 abiFilter가 있습니다. 나는 그 다음에 그것을 바꾼다. 편집 : 아무 변화가 없었다. 그래도 그것을 지적 주셔서 감사합니다. 앞으로는 목표를 무시하려고하지 않을 것입니다. – Johnk

    답변

    0

    내가 정의되지 않은 참조 오류를 일으키는 일이 .H 파일에 정의되지 않은 한 것을 발견 : 나는 Gradle을 콘솔에 좀 더 많은 오류 정보를 발견했다. 필자는 protobuf 라이브러리를 사용하기 위해서 .h 파일 만 필요하다는 인상하에 있었지만,이 함수들을 정의하기 위해서는 첨부 된 .cc 파일들이 필요합니다. 도와 주려고하는 모든 사람에게 감사드립니다. 바라기를, 나의 경험은 다른 누군가를 돕기 위하여 이용 될 것이다.

    관련 문제