2011-08-22 10 views
13

Voglio creare una versione nativa della libreria dei buffer di protocollo di Google.
Come faccio?Come creare un buffer di protocollo da Android NDK

+0

Solo un suggerimento. Per prima cosa, compilalo in Java, quindi se hai bisogno dell'ulteriore spostamento dell'ottimizzazione su NDK. Almeno in Java otterrete il protocollo di base verso il basso. – arunkumar

+0

Hai provato a utilizzare semplicemente l'implementazione C++ fornita da google? –

+0

Ecco la mia risposta: https://stackoverflow.com/a/44773137/529442 –

risposta

7

Io uso questo Android.mk e costruire SUCCESSO



    # Copyright (C) 2009 The Android Open Source Project 
    # 
    # Licensed under the Apache License, Version 2.0 (the "License"); 
    # you may not use this file except in compliance with the License. 
    # You may obtain a copy of the License at 
    # 
    #  http://www.apache.org/licenses/LICENSE-2.0 
    # 
    # Unless required by applicable law or agreed to in writing, software 
    # distributed under the License is distributed on an "AS IS" BASIS, 
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
    # See the License for the specific language governing permissions and 
    # limitations under the License. 
    # 
    # 

    LOCAL_PATH := $(call my-dir) 
    include $(CLEAR_VARS) 
    CC_LITE_SRC_FILES := \ 
     src/google/protobuf/stubs/common.cc        \ 
     src/google/protobuf/stubs/once.cc        \ 
     src/google/protobuf/stubs/hash.cc        \ 
     src/google/protobuf/extension_set.cc        \ 
     src/google/protobuf/generated_message_util.cc     \ 
     src/google/protobuf/message_lite.cc        \ 
     src/google/protobuf/repeated_field.cc       \ 
     src/google/protobuf/wire_format_lite.cc       \ 
     src/google/protobuf/io/coded_stream.cc       \ 
     src/google/protobuf/io/zero_copy_stream.cc      \ 
     src/google/protobuf/io/zero_copy_stream_impl_lite.cc 


    COMPILER_SRC_FILES := \ 
     src/google/protobuf/descriptor.cc \ 
     src/google/protobuf/descriptor.pb.cc \ 
     src/google/protobuf/descriptor_database.cc \ 
     src/google/protobuf/dynamic_message.cc \ 
     src/google/protobuf/extension_set.cc \ 
     src/google/protobuf/extension_set_heavy.cc \ 
     src/google/protobuf/generated_message_reflection.cc \ 
     src/google/protobuf/generated_message_util.cc \ 
     src/google/protobuf/message.cc \ 
     src/google/protobuf/message_lite.cc \ 
     src/google/protobuf/reflection_ops.cc \ 
     src/google/protobuf/repeated_field.cc \ 
     src/google/protobuf/service.cc \ 
     src/google/protobuf/text_format.cc \ 
     src/google/protobuf/unknown_field_set.cc \ 
     src/google/protobuf/wire_format.cc \ 
     src/google/protobuf/wire_format_lite.cc \ 
     src/google/protobuf/compiler/code_generator.cc \ 
     src/google/protobuf/compiler/command_line_interface.cc \ 
     src/google/protobuf/compiler/importer.cc \ 
     src/google/protobuf/compiler/main.cc \ 
     src/google/protobuf/compiler/parser.cc \ 
     src/google/protobuf/compiler/plugin.cc \ 
     src/google/protobuf/compiler/plugin.pb.cc \ 
     src/google/protobuf/compiler/subprocess.cc \ 
     src/google/protobuf/compiler/zip_writer.cc \ 
     src/google/protobuf/compiler/cpp/cpp_enum.cc \ 
     src/google/protobuf/compiler/cpp/cpp_enum_field.cc \ 
     src/google/protobuf/compiler/cpp/cpp_extension.cc \ 
     src/google/protobuf/compiler/cpp/cpp_field.cc \ 
     src/google/protobuf/compiler/cpp/cpp_file.cc \ 
     src/google/protobuf/compiler/cpp/cpp_generator.cc \ 
     src/google/protobuf/compiler/cpp/cpp_helpers.cc \ 
     src/google/protobuf/compiler/cpp/cpp_message.cc \ 
     src/google/protobuf/compiler/cpp/cpp_message_field.cc \ 
     src/google/protobuf/compiler/cpp/cpp_primitive_field.cc \ 
     src/google/protobuf/compiler/cpp/cpp_service.cc \ 
     src/google/protobuf/compiler/cpp/cpp_string_field.cc \ 
     src/google/protobuf/compiler/java/java_enum.cc \ 
     src/google/protobuf/compiler/java/java_enum_field.cc \ 
     src/google/protobuf/compiler/java/java_extension.cc \ 
     src/google/protobuf/compiler/java/java_field.cc \ 
     src/google/protobuf/compiler/java/java_file.cc \ 
     src/google/protobuf/compiler/java/java_generator.cc \ 
     src/google/protobuf/compiler/java/java_helpers.cc \ 
     src/google/protobuf/compiler/java/java_message.cc \ 
     src/google/protobuf/compiler/java/java_message_field.cc \ 
     src/google/protobuf/compiler/java/java_primitive_field.cc \ 
     src/google/protobuf/compiler/java/java_service.cc \ 
     src/google/protobuf/compiler/javamicro/javamicro_enum.cc \ 
     src/google/protobuf/compiler/javamicro/javamicro_enum_field.cc \ 
     src/google/protobuf/compiler/javamicro/javamicro_field.cc \ 
     src/google/protobuf/compiler/javamicro/javamicro_file.cc \ 
     src/google/protobuf/compiler/javamicro/javamicro_generator.cc \ 
     src/google/protobuf/compiler/javamicro/javamicro_helpers.cc \ 
     src/google/protobuf/compiler/javamicro/javamicro_message.cc \ 
     src/google/protobuf/compiler/javamicro/javamicro_message_field.cc \ 
     src/google/protobuf/compiler/javamicro/javamicro_primitive_field.cc \ 
     src/google/protobuf/compiler/python/python_generator.cc \ 
     src/google/protobuf/io/coded_stream.cc \ 
     src/google/protobuf/io/gzip_stream.cc \ 
     src/google/protobuf/io/printer.cc \ 
     src/google/protobuf/io/tokenizer.cc \ 
     src/google/protobuf/io/zero_copy_stream.cc \ 
     src/google/protobuf/io/zero_copy_stream_impl.cc \ 
     src/google/protobuf/io/zero_copy_stream_impl_lite.cc \ 
     src/google/protobuf/stubs/common.cc \ 
     src/google/protobuf/stubs/hash.cc \ 
     src/google/protobuf/stubs/once.cc \ 
     src/google/protobuf/stubs/structurally_valid.cc \ 
     src/google/protobuf/stubs/strutil.cc \ 
     src/google/protobuf/stubs/substitute.cc 

    # C++ full library 
    # ======================================================= 
    #include $(CLEAR_VARS) 

    LOCAL_MODULE := libprotobuf 
    LOCAL_MODULE_TAGS := optional 

    LOCAL_CPP_EXTENSION := .cc 

    LOCAL_SRC_FILES := \ 
     $(CC_LITE_SRC_FILES)            \ 
     src/google/protobuf/stubs/strutil.cc        \ 
     src/google/protobuf/stubs/substitute.cc       \ 
     src/google/protobuf/stubs/structurally_valid.cc     \ 
     src/google/protobuf/descriptor.cc        \ 
     src/google/protobuf/descriptor.pb.cc        \ 
     src/google/protobuf/descriptor_database.cc      \ 
     src/google/protobuf/dynamic_message.cc       \ 
     src/google/protobuf/extension_set_heavy.cc      \ 
     src/google/protobuf/generated_message_reflection.cc    \ 
     src/google/protobuf/message.cc         \ 
     src/google/protobuf/reflection_ops.cc       \ 
     src/google/protobuf/service.cc         \ 
     src/google/protobuf/text_format.cc        \ 
     src/google/protobuf/unknown_field_set.cc       \ 
     src/google/protobuf/wire_format.cc        \ 
     src/google/protobuf/io/gzip_stream.cc       \ 
     src/google/protobuf/io/printer.cc        \ 
     src/google/protobuf/io/tokenizer.cc        \ 
     src/google/protobuf/io/zero_copy_stream_impl.cc     \ 
     src/google/protobuf/compiler/importer.cc       \ 
     src/google/protobuf/compiler/parser.cc 

    LOCAL_C_INCLUDES := \ 
     $(LOCAL_PATH)/src 

    LOCAL_C_INCLUDES := \ 
     $(LOCAL_PATH)/android \ 
     bionic \ 
     $(LOCAL_PATH)/src \ 
     $(JNI_H_INCLUDE) 

    LOCAL_SHARED_LIBRARIES := \ 
     libz libcutils libutils 
    LOCAL_LDLIBS := -lz 
    # stlport conflicts with the host stl library 
    ifneq ($(TARGET_SIMULATOR),true) 
    LOCAL_C_INCLUDES += external/stlport/stlport 
    LOCAL_SHARED_LIBRARIES += libstlport 
    endif 

    # Define the header files to be copied 
    #LOCAL_COPY_HEADERS := \ 
    # src/google/protobuf/stubs/once.h \ 
    # src/google/protobuf/stubs/common.h \ 
    # src/google/protobuf/io/coded_stream.h \ 
    # src/google/protobuf/generated_message_util.h \ 
    # src/google/protobuf/repeated_field.h \ 
    # src/google/protobuf/extension_set.h \ 
    # src/google/protobuf/wire_format_lite_inl.h 
    # 
    #LOCAL_COPY_HEADERS_TO := $(LOCAL_MODULE) 

    LOCAL_CFLAGS := -DGOOGLE_PROTOBUF_NO_RTTI 

    include $(BUILD_SHARED_LIBRARY) 

+0

Questo è leggermente obsoleto. Per protobuf 2.4.1 hash.cc non esiste, quindi dovrebbe essere rimosso. Se vai a protobug 2.5.0, lo stesso accordo e hai bisogno di aggiungere src/google/protobuf/stubs/stringprintf.cc – gkanwar

+1

@gkanwar quando faccio le modifiche che suggerisci, la lib compila ma ottengo questo errore quando provo a chiama il mio metodo che dipende dalle librerie protobuf: causato da: java.lang.UnsatisfiedLinkError: Impossibile caricare la libreria: reloc_library [1306]: 37 non può localizzare 'strtof' ... utilizzando "nm" noto che il metodo strtof è elencato ma ha una "U" elencata accanto ad essa. C'è una libreria che non includo è necessaria per il funzionamento di protobuf? –

+0

@MichaelNguyen strtof dovrebbe vivere nella libreria stl. libprotobuf usa stlport; il file di build descritto nella risposta lo collega come una libreria condivisa piuttosto che statico, quindi dovresti caricare libstlport anche da Java. Puoi trovare un esempio che funziona in un progetto su cui sto lavorando qui: https://github.com/IDKJava/the-elements/blob/master/TheElements-dev/src/com/idkjava/thelements/MainActivity.java # L605 – gkanwar

4

Android.mk di cui sopra funziona bene, grazie mille.

Vorrei descrivere tutti i passaggi per la creazione di protobuf per Android.

  • Configurare origini per Android. utilizzare il seguente script (ottenuto qui: http://habrahabr.ru/post/119693/):

    montate =/Users/utente/android-NDK-R7B/toolchain/arm-linux-androideabi-4.4.3

    platform =/Users/utente/android-ndk-r7b/piattaforme/android-3/arch-arm/

    esportazione CC = "/ Utenti/utente/android-ndk-r7b/toolchains/arm-linux-androideabi- 4.4.3/precostruito/darwin-x86/bin/arm-linux-gcc-androideabi"

    CFLAGS export = "- fPIC -DANDROID -nostdlib"

    export ANDROID_ROOT = "/ Utenti/utente/android-ndk-r7b"

    esportazione LDFLAGS = "- Wl, -rpath-link = $ ANDROID_ROOT/piattaforme/android-3/arch-arm/usr/lib/-L $ ANDROID_ROOT/piattaforme/android-3/arch-braccio/usr/lib /"

    CPPFLAGS esportazione = "- I $ ANDROID_ROOT/piattaforme/android-3/arch-braccio/usr/include /"

    export LIBS = "- lc"

    ./configure --host = braccio EABI

  • Eliminare le seguenti linee di fr om menzionato sopra il file Android.mk:

    src/google/protobuf/stubs/strutil.cc    \ 
    src/google/protobuf/stubs/substitute.cc       \ 
    src/google/protobuf/stubs/structurally_valid.cc     \ 
    src/google/protobuf/descriptor.cc        \ 
    src/google/protobuf/descriptor.pb.cc        \ 
    src/google/protobuf/descriptor_database.cc      \ 
    src/google/protobuf/dynamic_message.cc       \ 
    src/google/protobuf/extension_set_heavy.cc      \ 
    src/google/protobuf/generated_message_reflection.cc    \ 
    src/google/protobuf/message.cc         \ 
    src/google/protobuf/reflection_ops.cc       \ 
    src/google/protobuf/service.cc         \ 
    src/google/protobuf/text_format.cc        \ 
    src/google/protobuf/unknown_field_set.cc       \ 
    src/google/protobuf/wire_format.cc        \ 
    src/google/protobuf/io/gzip_stream.cc       \ 
    src/google/protobuf/io/printer.cc        \ 
    src/google/protobuf/io/tokenizer.cc        \ 
    src/google/protobuf/io/zero_copy_stream_impl.cc     \ 
    src/google/protobuf/compiler/importer.cc       \ 
    src/google/protobuf/compiler/parser.cc 
    

    E 'necessario per la costruzione di una versione lite della libreria. Purtroppo la versione completa della lib funziona solo da Android 2.3. Ho provato la versione Lite per Android 1.6, 2.1, 2.3.

  • creare la libreria utilizzando ndk-build.
  • per generare file C++ (utilizzando il compilatore protoc) per la libreria lite è necessario includere: opzione optimize_for = LITE_RUNTIME; nel file .proto.
+0

quando rimuovo le righe menzionate ottengo un errore di compilazione. Sei sicuro che quelle linee debbano essere rimosse? –

+0

Lei sembra aver dimenticato di impostare sysroot a CPPFLAGS: 'export SYSROOT = $ NDK_ROOT/piattaforme/android-9/arch-arm' ' CPPFLAGS export = "- sysroot = $ SYSROOT" '' ./configure options' –