我无法使用带有$ NDK /编译/工具/ make-standalone-toolchain.sh脚本创建一个独立的NDK工具链建设协议缓冲区为Android。 我遇到的问题是这样的:
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'
这似乎暗示并行线程库丢失,但是SYSROOT由NDK脚本,以便创建应该包含一切,对不对? 我读的地方,它是没有必要使用独立的工具链时,明确地将并行线程。 我使用的配置命令为:
./configure --host=arm-eabi --with-sysroot=$SYSROOT CC=$CC --enable-cross-compile --with-protoc=protoc LIBS="-lc"
当环境变量被设置为在由脚本创建的SYSROOT点。
我已经看到了一些在网络上的网页这个问题,但没有人似乎已经张贴解答。 任何人都可以帮忙吗?
我设法使用NDK-build方法来构建它,使用信息在这里找到: 如何由Android NDK建立协议缓冲
要设置的配置脚本,我跑以下命令:
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"
这是我用Application.mk:
APP_STL := gnustl_static
APP_ABI := armeabi-v7a armeabi
APP_PROJECT_PATH := ./
APP_BUILD_SCRIPT := ./Android.mk
而Android.mk使用:
# 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)
要在我使用协议缓冲区我在其他项目NDK内置库,我使用的库到库复制到项目的JNI文件夹,并修改其Android.mk添加一个引用到它:
...
...
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)
我认为这是它,希望有人发现它是有用的。
我有一个很难在Windows上使用NDK,建造建筑物的Protobuf为Android,但管理使用做到这一点: - Cygwin的 - Android的NDK-R12B
这些步骤是protobuf的3.6.1。 步骤: - 克隆protobuf的回购 - 在回购的根目录,创建一个名为新文件夹“JNI”(/路径/到/回购/ protobuf的/ JNI) - 创建一个名为Android.mk广告粘贴内以下行新文件
# 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)
IGNORED_WARNINGS := -Wno-sign-compare -Wno-unused-parameter -Wno-sign-promo -Wno-error=return-type
COMPILER_SRC_FILES := \
../src/google/protobuf/arena.cc \
../src/google/protobuf/arenastring.cc \
../src/google/protobuf/extension_set.cc \
../src/google/protobuf/generated_message_table_driven_lite.cc \
../src/google/protobuf/generated_message_util.cc \
../src/google/protobuf/implicit_weak_message.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 \
../src/google/protobuf/message_lite.cc \
../src/google/protobuf/repeated_field.cc \
../src/google/protobuf/stubs/bytestream.cc \
../src/google/protobuf/stubs/common.cc \
../src/google/protobuf/stubs/int128.cc \
../src/google/protobuf/stubs/io_win32.cc \
../src/google/protobuf/stubs/status.cc \
../src/google/protobuf/stubs/statusor.cc \
../src/google/protobuf/stubs/stringpiece.cc \
../src/google/protobuf/stubs/stringprintf.cc \
../src/google/protobuf/stubs/structurally_valid.cc \
../src/google/protobuf/stubs/strutil.cc \
../src/google/protobuf/stubs/time.cc \
../src/google/protobuf/wire_format_lite.cc \
../src/google/protobuf/any.cc \
../src/google/protobuf/any.pb.cc \
../src/google/protobuf/api.pb.cc \
../src/google/protobuf/compiler/importer.cc \
../src/google/protobuf/compiler/parser.cc \
../src/google/protobuf/descriptor.cc \
../src/google/protobuf/descriptor.pb.cc \
../src/google/protobuf/descriptor_database.cc \
../src/google/protobuf/duration.pb.cc \
../src/google/protobuf/dynamic_message.cc \
../src/google/protobuf/empty.pb.cc \
../src/google/protobuf/extension_set_heavy.cc \
../src/google/protobuf/field_mask.pb.cc \
../src/google/protobuf/generated_message_reflection.cc \
../src/google/protobuf/generated_message_table_driven.cc \
../src/google/protobuf/io/gzip_stream.cc \
../src/google/protobuf/io/printer.cc \
../src/google/protobuf/io/strtod.cc \
../src/google/protobuf/io/tokenizer.cc \
../src/google/protobuf/io/zero_copy_stream_impl.cc \
../src/google/protobuf/map_field.cc \
../src/google/protobuf/message.cc \
../src/google/protobuf/reflection_ops.cc \
../src/google/protobuf/service.cc \
../src/google/protobuf/source_context.pb.cc \
../src/google/protobuf/struct.pb.cc \
../src/google/protobuf/stubs/mathlimits.cc \
../src/google/protobuf/stubs/substitute.cc \
../src/google/protobuf/text_format.cc \
../src/google/protobuf/timestamp.pb.cc \
../src/google/protobuf/type.pb.cc \
../src/google/protobuf/unknown_field_set.cc \
../src/google/protobuf/util/delimited_message_util.cc \
../src/google/protobuf/util/field_comparator.cc \
../src/google/protobuf/util/field_mask_util.cc \
../src/google/protobuf/util/internal/datapiece.cc \
../src/google/protobuf/util/internal/default_value_objectwriter.cc \
../src/google/protobuf/util/internal/error_listener.cc \
../src/google/protobuf/util/internal/field_mask_utility.cc \
../src/google/protobuf/util/internal/json_escaping.cc \
../src/google/protobuf/util/internal/json_objectwriter.cc \
../src/google/protobuf/util/internal/json_stream_parser.cc \
../src/google/protobuf/util/internal/object_writer.cc \
../src/google/protobuf/util/internal/proto_writer.cc \
../src/google/protobuf/util/internal/protostream_objectsource.cc \
../src/google/protobuf/util/internal/protostream_objectwriter.cc \
../src/google/protobuf/util/internal/type_info.cc \
../src/google/protobuf/util/internal/type_info_test_helper.cc \
../src/google/protobuf/util/internal/utility.cc \
../src/google/protobuf/util/json_util.cc \
../src/google/protobuf/util/message_differencer.cc \
../src/google/protobuf/util/time_util.cc \
../src/google/protobuf/util/type_resolver_util.cc \
../src/google/protobuf/wire_format.cc \
../src/google/protobuf/wrappers.pb.cc \
include $(CLEAR_VARS)
LOCAL_MODULE := libprotobuf
LOCAL_CPP_EXTENSION := .cc
LOCAL_SRC_FILES := $(COMPILER_SRC_FILES)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/../android \
$(LOCAL_PATH)/../src
LOCAL_CFLAGS := -frtti -DHAVE_PTHREAD $(IGNORED_WARNINGS)
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/../src
LOCAL_CPPFLAGS := -std=c++11
LOCAL_C_INCLUDES += ${ANDROID_NDK}sources/cxx-stl/gnu-libstdc++/4.9/include
LOCAL_C_INCLUDES += ${ANDROID_NDK}sources/cxx-stl/gnu-libstdc++/4.9/libs/$(APP_ABI)/include
LOCAL_C_INCLUDES += ${ANDROID_NDK}platforms/${APP_PLATFORM}/arch-$(TARGET_ARCH)/usr/include
LOCAL_LDLIBS += -lz -llog
LOCAL_STATIC_LIBRARIES += -lpthread
LOCAL_EXPORT_LDLIBS += -lz
LOCAL_EXPORT_CFLAGS := $(LOCAL_CFLAGS)
LOCAL_EXPORT_CPPFLAGS := $(LOCAL_CPPFLAGS)
include $(BUILD_SHARED_LIBRARY)
- 创建一个名为Application.mk文件并粘贴里面下面的代码
APP_STL := gnustl_static APP_ABI := armeabi-v7a APP_PLATFORM:=android-27
- 启动Cygwin和导航到protobuf的回购。
- 运行
./Configure
(如果失败的话,可能是因为你缺少在Cygwin的一些工具。安装它们) - 导出指向NDK文件夹的根目录下的ANDROID_NDK环境变量
- 该路径添加到NDK的构建工具在PATH环境变量
- 运行
ndk-build
A“库”文件夹中应该有你在application.mk指定的架构libprotobuf.so创建
希望这可以帮助