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
cevap
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)
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
@ 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ı? –
@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
ç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.
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 = –
Sen CPPFLAGS de sistemkökü kurmayı unuttuğu gibi görünüyor options' –
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
Google tarafından sağlanan C++ uygulamasını kullanmayı denediniz mi? –
İşte benim cevabım: https://stackoverflow.com/a/44773137/529442 –