Construyendo búferes de protocolo con una cadena de herramientas NDK independiente
Tengo problemas para construir Buffers de protocolo para Android usando una cadena de herramientas NDK autónoma creada con el script $ NDK / build / tools / make-standalone-toolchain.sh. El problema que tengo es el siguiente:
libtool: link: g++ -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare -O2 -g -DNDEBUG -o protoc main.o ./.libs/libprotobuf.a ./.libs/libprotoc.a /home/sizeak/AudioFingerprinting/ProtoBuf/jni/src/.libs/libprotobuf.a -lz -lc ./.libs/libprotoc.a(plugin.pb.o): In function `GoogleOnceInit': /home/sizeak/AudioFingerprinting/ProtoBuf/jni/src/./google/protobuf/stubs/once.h:115: undefined reference to `pthread_once'
Lo que parece implicar que la biblioteca pthreads falta, sin embargo el sysroot fue creado por el script ndk por lo que debe contener todo, ¿verdad? He leído en alguna parte que es innecesario vincular explícitamente pthreads cuando se usa la cadena de herramientas independiente. El comando de configuración que usé fue:
- Android Ndk Basic: Ayuda sobre Native String
- Android AlertDialog congela la aplicación unos segundos después de mostrarse - la causa parece relacionada con OpenSL
- Instalación del complemento de Android NDK en eclipse SDK
- Punto flotante o de punto fijo para Android NDK aplicaciones OpenGL?
- De repente, la hormiga / carpeta no aparece en el SDK de Android. Google lo eliminó?
./configure --host=arm-eabi --with-sysroot=$SYSROOT CC=$CC --enable-cross-compile --with-protoc=protoc LIBS="-lc"
Donde las variables de entorno están configuradas para apuntar en el sysroot creado por el script.
He visto este problema en un número de páginas en la red, pero nadie parece haber publicado una respuesta. ¿Alguien puede ayudar?
- Error de NDKBuild
- Construyendo FFMPEG con librtmp para android
- Free Pascal para Android en MIPS
- Android NDK desborda la tabla de referencia local JNI de dalvik
- Android- Cómo compilar ffmpeg para todas las arquitecturas cpu
- Recibe la entrada completa de unicode android en C / C ++
- Error :() referencia indefinida a `__android_log_write 'ERROR?
- Androide ndk multitouch
Conseguí construirlo usando el método ndk-build, usando la información que se encuentra aquí: Cómo construir un buffer de protocolo para Android NDK
Para configurar el script de configuración, ejecuté estos comandos:
export CFLAGS="-march=armv7-a -mfloat-abi=softfp -DGOOGLE_PROTOBUF_NO_RTTI" export CC=arm-linux-androideabi-gcc export SYSROOT=$NDK/platforms/android-9/arch-arm ./configure --host=arm-eabi --with-sysroot=$SYSROOT CC=$CC --enable-cross-compile --with-protoc=protoc LIBS="-lc"
Este es el Application.mk que utilicé:
APP_STL := gnustl_static APP_ABI := armeabi-v7a armeabi APP_PROJECT_PATH := ./ APP_BUILD_SCRIPT := ./Android.mk
Y el Android.mk utilizado:
# 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/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/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-lite 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)
Para incluir la biblioteca construida en mi otro proyecto NDK en el que estoy usando Buffers de protocolo, tuve que copiar la biblioteca en la carpeta jni del proyecto usando la biblioteca y modificar su Android.mk para añadir una referencia a ella:
... ... LOCAL_LDLIBS := -llog -lOpenSLES -lGLESv2 jni/libprotobuf-lite.so include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := protobuf-lite LOCAL_SRC_FILES := libprotobuf-lite.so include $(PREBUILT_SHARED_LIBRARY)
Creo que eso es todo, espero que alguien lo encuentre útil.
- Mi aplicación para Android muestra que "este elemento no es compatible con tu dispositivo"
- 2 diseños 1 actividad android