使用独立 NDK 工具链构建协议缓冲区

2023-12-07

我在使用 $NDK/build/tools/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'

这似乎意味着 pthreads 库丢失,但是 sysroot 是由 ndk 脚本创建的,所以应该包含所有内容,对吗?我在某处读到,使用独立工具链时没有必要显式链接 pthreads。我使用的配置命令是:

./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)

为了将构建的库包含在我使用 Protocol Buffers 的其他 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)

我想就是这样,希望有人觉得它有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用独立 NDK 工具链构建协议缓冲区 的相关文章

  • Cheesesquare:enterAlways 会产生错误的布局

    Adding enterAlways到 Cheesesquare 演示的滚动标志
  • Android Q:file.mkdirs() 返回 false

    我们有一个应用程序 使用外部存储来存储一些临时文件 图像 二进制数据 该代码已经运行了几年 直到最近才发生重大变化 在 Android Q 上它不起作用 File f new File Environment getExternalStor
  • fetchUuidsWithSdp 的奇怪 UUID 逆转

    我有一个在树莓派上运行的 python 蓝牙服务器 使用 PyBluez 我在服务器中使用的uuid是 8f86d132 4ab8 4c15 b8df 0b70cf10ea56 我正在打电话device fetchUuidsWithSdp
  • 如何在 Linux 内核中定义并触发我自己的新软中断?

    我想在 Linux 内核中创建自己的软中断 这是正确的方法吗 In the init我想触发该模块的softirq我将添加一个调用 394 void open softirq int nr void action struct softir
  • Android 初学者:Android gridview 中的触摸事件

    我正在使用以下代码来使用 gridview 执行操作 稍作修改http developer android com resources tutorials views hello gridview html http developer a
  • 如何在我现有的 Android 应用程序中使用 Telegram API(包括聊天应用程序)?

    我想使用 telegram API 在我现有的 Android 应用程序中开发聊天功能 我不知道如何实施 我认为 看看Telegram 数据库库 测试版 从这里TDLib https core telegram org tdlib 俄语 但
  • 如何重定向到 instagram://user?username={username}

    我的 html 页面上有这个链接 可以在特定用户上打开 Instagram 应用程序 a href Link to Instagram Profile a 我一直在寻找自动运行 url instagram user username USE
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • Android Eclipse 上的 Web 服务

    我是 android eclipse java 的新手 事实上这个论坛也是如此 有人遇到过这种情况吗 从用户那里获取输入并通过使用 android eclipse 中的 Web 服务来显示适当的结果 有可用的示例吗 非常感谢 我正在发布教程
  • 图像作为电子邮件附件

    我想构建一个应用程序 我可以在电子邮件中附加图像 打开图像并将其设置为我的壁纸 我想让它跨平台 所以你能告诉我是否可以使用phonegap 或者我是否必须为iphone和android构建一个本机应用程序 您好 如果您只想通过电子邮件附加图
  • 如何将 protobuf-net 与不可变值类型一起使用?

    假设我有一个像这样的不可变值类型 Serializable DataContract public struct MyValueType ISerializable private readonly int x private readon
  • Mipmap 与可绘制文件夹[重复]

    这个问题在这里已经有答案了 我正在使用 Android Studio 1 1 Preview 1 我注意到 当我创建一个新项目时 我得到以下层次结构 不同 DPI 的 Mipmap 文件夹 不再有不同 DPI 的可绘制文件夹 我应该将所有资
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • OnLongClickListener 不工作

    我有一个ImageView 我需要使用onLongClickListener对于图像视图 当我使用这段代码时 什么也没有发生 Code gallery Gallery findViewById R id gall1 gallery setA
  • Android Studio 缓慢的增量构建

    我已经完成了许多步骤来完善我们的构建系统 those https stackoverflow com questions 16775197 building and running app via gradle and android st
  • Android 中的处理程序与异步调用

    目前我正在使用处理程序来调用 Web 服务方法以使其在后台运行 问题是它需要更多的时间来给出响应 在性能方面似乎更昂贵 现在我计划使用异步调用 哪一个是最好的 Android 中的处理程序和异步调用有什么区别 请帮我想出一个最好的解决方案
  • 上网本上可以进行Android开发吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用我的上网本进行 Android 开发 但是当我尝试使用 Eclipse 运行 SDK 时 没有加载任何内容 上网本对于 Android 开发来
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 如何使用 AccessibilityService 在 Android 中模拟按键

    我正在编写一个辅助服务 我一直在尝试在应用程序上进行一些自动搜索 我使用accessibilityservice action paste来填充EditText 然后我需要模拟软键盘上的按键 但我不知道如何做 你们能帮我一下吗 你可以尝试A
  • Android 后台倒计时器

    我有一个 Android 应用程序 它管理一个倒计时器 类 CountDownTimer 它显示在应用程序屏幕中 以显示到达 00 00 还剩多少时间 我现在的问题是 当我按主页按钮或启动另一个应用程序时 应用程序 计时器不会在后台运行 所

随机推荐

  • 未捕获的类型错误:无法读取未定义的属性“顶部”

    如果这个问题已经得到解答 我深表歉意 我尝试寻找解决方案 但找不到适合我的代码的解决方案 我对 jQuery 还是个新手 我有两个不同类型的粘性菜单用于两个不同的页面 这是两者的代码 document ready function var
  • 未捕获的类型错误:对象 [object Object] 没有方法“覆盖”

    为什么我的覆盖 jquery 代码会出现此错误 这是代码 jQuery document ready function if the function argument is given to overlay it is assumed t
  • Azure B2C - 添加/更新身份验证联系信息

    我们正在使用 Azure B2C使用 MFA 重置密码策略 ADAL 用于身份验证和 Graph API 来创建 更新用户 当用户调用重置密码策略 通过应用程序上的链接 时 他首先需要提供发送验证码的电子邮件地址 然后 因为启用了 MFA
  • 有没有办法在 Android 中找到 HTTP 请求和响应的完整大小(用于数据使用跟踪)?

    我想跟踪我的应用程序的数据使用情况 但要做到这一点 我需要能够获取一个应用程序的完整大小HttpUriRequest and HttpResponse 简单地获取尺寸HttpEntity还不够 因为请求和响应都传输更多数据 标头 参数 传输
  • 数组值应该排序(字母、数字和特殊字符)

    我尝试像数组一样排序 如下所示 let students Set 23412334 234 fwv Kofi Abena Peter Kweku Akosua let sortedStudents students sorted print
  • Java 模块指令如何影响对模块的反射访问?

    根据https www oracle com corporate features understanding java 9 modules html Java Module系统引入了以下指令 出口 出口 到 uses 提供 与 打开 打开
  • 使用 jquery 替换页面加载时 DIV 的内容

    使用 jquery 有没有一种方法可以在页面加载时获取 DIV 的内容并用其他内容替换它 div class content Before div to div class content After div Use text conten
  • 如何知道 Jupyter Notebook 中正在运行哪个 Python?

    我在浏览器中使用 Jupyter Notebook 进行 Python 编程 我已经安装了 Anaconda Python 3 5 但我很确定 Jupyter 正在使用本机 python 解释器而不是 anaconda 运行我的 pytho
  • 如何让 ms-access 以其他用户身份连接到 ms-sql?

    如何让 ms access 以与其 Active Directory ID 不同的用户身份连接 通过 ODBC 到 ms sql 数据库 我不想在 ODBC 连接中指定帐户 我想在 ms access 端执行此操作以对用户隐藏它 在 ODB
  • 钥匙串 - 安全数据存储

    我正在开发一个带有钥匙串实现的应用程序 我能够创建数据并将其保存到钥匙串中 我正在使用钥匙串包装类由苹果公司提供 根据要求 我必须在钥匙串中实现尽可能好的安全性 安全团队指出了一些缺陷 例如在越狱设备上的可访问性 有人可以给我指导吗 我还使
  • 设置自定义中线颜色并将刻度标签颜色设置为箱线图面颜色

    我正在使用这个漂亮的箱线图 Parfait 的回答 我遇到了越界错误j并不得不使用range i 5 i 5 5 Why 我想将中位数设置为特定颜色 比方说red medianprops dict color red 行不通的 怎么做 如何
  • 具有小面和相同条形尺寸(binwidth)的条形图,并可选择缩小面板尺寸

    我想使用类似方面的方式比较数据bar plot 但缺少数据会导致条形 宽度 不同 我怎么能够 确保相同的条形尺寸 宽度 和 很好 将每个面的面板尺寸缩小到真正需要的尺寸 PS 我不想将空数据显示为 零栏 以免浪费空间 library ggp
  • 生成 URL 别名??在 PHP 中

    我刚刚在某个地方看到了这个 我对此很感兴趣 但似乎在任何地方都找不到它 或者我只是用了错误的词来搜索 嗯 我看到了这个链接 http splur gy r QqVYf r 2tgNklHgmVK 当我点击它时 我被重定向到另一个页面 该页面
  • 使用 google api 时如何设置刷新令牌?

    我正在研究一个示例 试图学习如何使用 google api 更改日历上的事件 服务器是根据数据库中的信息更新日历的用户 实际上不需要用户交互 问题是我在获取 使用刷新令牌时遇到问题 我单击添加到页面的 连接我 链接 但出现错误 Fatal
  • 无法在 php 会话中传递 mysqli 连接

    我试图通过 mysqli 连接的会话来进行站点上的多个查询 但是当我尝试执行查询时 它会输出警告 无法获取 mysqli SESSION db new mysqli host username password db 是否不可能通过会话传递
  • 如何在 Protégé 中使用 OWL 解决爱因斯坦之谜时获得个人结果?

    我想更好地理解本体论和推理 有一个有趣的谜题叫做爱因斯坦的谜语在网上可以借助本体论和推理来解决 我从该站点下载了 OWL 本体并将其导入 Protege 4 0 2 不适用于 4 1 我可以通过以下方式启动推理机推理机 FaCT 推理机 分
  • oracle中格式化DATE

    我的表中有一个日期字段 其中包含 dd MMM yy 格式的日期 我想创建一个函数来获取此日期 检查它是否为空 然后将其更改为 yyyy mm dd 格式 但问题是oracle不接受dd MM YYyy格式的日期作为输入参数 它说 请使用
  • .net core 是否支持代码契约?

    在 net 框架中 有代码契约允许我在代码中指定前置 后置条件 net core net 5 支持它们吗 命名空间System Diagnostics Contracts可用 但项目是弃 另类VS2019 https softwarerec
  • 嵌套集模型 PHP 库

    您好 我需要使用嵌套集模型来管理我网站上的产品类别 有谁知道一些好的预构建 PHP 库用于处理 MySQL 中的嵌套集 你可以尝试 Baobab 这是我最近发布的一个库 http www sideralis org baobab
  • 使用独立 NDK 工具链构建协议缓冲区

    我在使用 NDK build tools make standalone toolchain sh 脚本创建的独立 NDK 工具链构建 Android 协议缓冲区时遇到问题 我遇到的问题是这样的 libtool link g Wall Ww