2011-08-22 28 views
13

Google'ın protokol arabellek kitaplığının yerel bir sürümünü oluşturmak istiyorum.
Bunu nasıl yaparım?Android için protokol arabelleği oluşturma NDK

+0

Sadece bir öneri. İlk önce onu Java'da oluşturun ve daha sonra optimizasyona ihtiyacınız varsa NDK'ya geçin. En azından Java'da temel protokolü indirirsiniz. – arunkumar

+0

Google tarafından sağlanan C++ uygulamasını kullanmayı denediniz mi? –

+0

İşte benim cevabım: https://stackoverflow.com/a/44773137/529442 –

cevap

7

Bu Android.mk kullanın ve bir çok Android.mk yukarıda belirtilen BAŞARILI



    # 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

Bu biraz güncel değil. Protobuf 2.4.1 hash.cc için mevcut değil, bu yüzden kaldırılmalıdır. Eğer protobug 2.5.0 kadar gidiyorsa, aynı anlaşma artı önerdiğiniz düzenlemeler yaparken src/google/protobuf/stubs/stringprintf.cc – gkanwar

+1

@ gkanwar eklemeniz gerekiyorsa, lib derler ama denediğimde bu hatayı alıyorum protobuf libs'e bağlı olan yöntemimi ara: Nedeni: java.lang.UnsatisfiedLinkError: Kitaplık yüklenemiyor: reloc_library [1306]: 37 'strtof' yerini alamıyor ... "nm" kullanarak strtof yönteminin listelendiğini fark ediyorum ancak yanında listelenen "U" harfi var. Protobuf'un çalışması için gerekli olan bir kütüphane var mı? –

+0

@MichaelNguyen strtof, stl kütüphanesinde yaşamalıdır. libprotobuf stlport kullanır; cevapta açıklanan yapı dosyası onu statik değil paylaşılan bir kitaplık olarak bağlar, bu yüzden libstlport'u da Java'dan yüklemelisiniz. Burada çalıştığım bir projede çalışan bir örnek bulabilirsiniz: https://github.com/IDKJava/the-elements/blob/master/TheElements-dev/src/com/idkjava/thelements/MainActivity.java # L605 – gkanwar

4

çalışıyor sayesinde kurmak.

Android için protobuf oluşturmak için tüm adımları açıklamak istiyorum.

  • Android için kaynakları yapılandırın. kullanın Aşağıdaki komut dosyası (: http://habrahabr.ru/post/119693/ burada var):

    önceden oluşturulmuş =/Users/kullanıcı/android-ndk--R7b/toolchain/kol-linux-androideabi-4.4.3

    PLATFORMU =/Users/user/android-ndk-r7b/platformlar/android-3/arch-arm/

    ihracat CC = "/ Kullanıcılar/kullanıcı/android-ndk-r7b/araç zincirleri/arm-linux-androideabi- 4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-gcc"

    ihracat CFLAGS = "- FPIC -DANDROID -nostdlib"

    ihracat ANDROID_ROOT = "/ Users/kullanıcı/android-ndk--R7b"

    ihracat LDFLAGS = "- wı, -rpath-link = $ ANDROID_ROOT/platformlar/android-3/ezeli kol/usr/lib/-L $ ANDROID_ROOT/platformlar/android-3/ezeli kol/usr/lib /"

    ihracat CPPFLAGS = "- Ben $ ANDROID_ROOT/platformlar/android-3/ezeli kol/usr/include /"

    ihracat LIBS = "- lc"

    ./configure --host =

  • kol-EABI aşağıdaki satırları fr Sil om, yukarıda sözü edilen Android.mk dosyasında belirtilmiştir:

    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 
    

    Kütüphanenin lite versiyonunu oluşturmak için gereklidir. Maalesef lib'in tam sürümü sadece Android 2.3'ten çalışıyor. Android 1.6, 2.1, 2.3 için lite sürümünü test ettim. Ndk-build kullanarak kütüphaneyi

  • oluşturun. Lite kütüphanesi için C++ dosyalarını (protoc derleyicisini kullanarak) oluşturmak için
  • eklenmesi gerekir: option optimize_for = LITE_RUNTIME; .proto dosyasında.
+0

Belirtilen satırları kaldırdığımda bir derleme hatası alıyorum. Bu hatların kaldırılması gerektiğinden emin misin? "- sysroot = $ SYSROOT" ' ' ./configure 'ihracat SYSROOT = $ NDK_ROOT/platformlar/android-9/ezeli arm' ' ihracat: CPPFLAGS = –

+0

Sen CPPFLAGS de sistemkökü kurmayı unuttuğu gibi görünüyor options' –