当前位置: 首页 > news >正文

android-ndk开发(10): use of undeclared identifier ‘pthread_getname_np‘

1. 报错描述

使用 pthread 获取线程名字, 用到 pthread_getname_np 函数。 交叉编译到 Android NDK 时链接报错

test_pthread.cpp:19:5: error: use of undeclared identifier 'pthread_getname_np'19 |     pthread_getname_np(thread_id, thread_name, sizeof(thread_name));|     ^
1 error generated.
ninja: build stopped: subcommand failed.

用到的构建脚本 build-android.ps1:

$NDK="d:/soft/android-ndk/r28b"
$BUILD_DIR = "build-android"cmake `-S . `-B $BUILD_DIR `-G Ninja `-DCMAKE_TOOLCHAIN_FILE="$NDK/build/cmake/android.toolchain.cmake" `-DANDROID_ABI=arm64-v8a `-DANDROID_PLATFORM=21cmake --build $BUILD_DIR

用到的关键代码: test_pthread.cpp

// 线程函数
void* hello(void* arg)
{char thread_name[16];pthread_getname_np(thread_id, thread_name, sizeof(thread_name));printf("Thread name: %s\n", thread_name);return NULL;
}

3. 分析和解决

3.1 pthread_getname_np 的 np 是什么意思?

是 non portable (不可移植) 的意思.

https://man7.org/linux/man-pages/man3/pthread_getname_np.3.html (参考链接[1])

hence the suffix “_np” (nonportable) in the names.

3.2 torchat issue 2

https://github.com/FraMecca/torchat/issues/2 (参考链接[2])

提问者贴出的编译 log,看起来是 linux-x64 native 编译。

仓库 owner 回复说, 需要定义 _GNU_SOURCE 宏。

The issue is probably related to a missing #define _GNU_SOURCE .

尝试在 test_pthread.cpp 开头添加, 报错不变。

3.3 pocoproject issue 4042

https://github.com/pocoproject/poco/issues/4042 (参考链接[5]) 报告了相同的错误, 是在 android armv7-a.

project member 和 contributor 的回答没什么用处。 用户已经包含了 pthread.h 头文件。

3.4 从 bionic 找到答案

pthread 是在 Android bionic 库里定义实现的。

git clone https://android.googlesource.com/platform/bionic  # 参考链接[3]

pthread_getname_np 为关键字在 *.md 文件里搜索, docs\status.md 有说明:

https://android.googlesource.com/platform/bionic.git/+/refs/heads/main/docs/status.md#libc (参考链接[4]) 是它在线版:

在这里插入图片描述

New libc functions in O (API level 26):...* `pthread_getname_np`

意思是: pthread_getname_np() 是 API level 26 开始支持的.

因此解决方案是:修改 -DANDROID_PLATFORM=21-DANDROID_PLATFORM=26 或更高版本:

build-android.ps1:

$NDK="d:/soft/android-ndk/r28b"
$BUILD_DIR = "build-android"cmake `-S . `-B $BUILD_DIR `-G Ninja `-DCMAKE_TOOLCHAIN_FILE="$NDK/build/cmake/android.toolchain.cmake" `-DANDROID_ABI=arm64-v8a `-DANDROID_PLATFORM=26cmake --build $BUILD_DIR

4. 总结

pthread_getname_np() 是在 Android API 26 新增的函数, 在 cmake configure 阶段需要传入 -DANDROID_PLATFORM=26 或更高版本。 这在 Android C 标准库 bionic 的文档里有提及: https://android.googlesource.com/platform/bionic.git/+/refs/heads/main/docs/status.md 。

References

  • [1] https://man7.org/linux/man-pages/man3/pthread_getname_np.3.html
  • [2] https://github.com/FraMecca/torchat/issues/2 (方案无效)
  • [3] https://android.googlesource.com/platform/bionic.git/
  • [4] https://android.googlesource.com/platform/bionic.git/+/refs/heads/main/docs/status.md#libc
  • [5] https://github.com/pocoproject/poco/issues/4042

相关文章:

  • exo:打造家用设备AI集群的开源解决方案
  • 基于Flink的用户画像 OLAP 实时数仓统计分析
  • Android NDK版本迭代与FFmpeg交叉编译完全指南
  • CTF - PWN之ORW记录
  • 手写 vue 源码 ===:自定义调度器、递归调用规避与深度代理
  • 【Linux】socket网络编程之UDP
  • 主场景 工具栏 植物卡牌的渲染
  • 使用adb设置wifi相关
  • 《100天精通Python——基础篇 2025 第16天:异常处理与调试机制详解》
  • SpringCloud服务拆分:Nacos服务注册中心 + LoadBalancer服务负载均衡使用
  • LeetCode 热题 100 131. 分割回文串
  • 【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件
  • 湖北理元理律师事务所:债务优化中的“生活保障”方法论
  • 软件逆向工程核心技术:脱壳原理与实战分析
  • 前端开发中移动端调试的日常工具整理
  • 《React Native性能优化:从卡顿到丝滑的蜕变之旅》
  • 信创生态核心技术栈:数据库与中间件
  • Vue 3.0中Treeshaking特性
  • 迪士尼机器人BD-X 概况
  • # 如何使用 PyQt5 创建一个简单的警报器控制界面
  • 花2万多在海底捞办婚礼,连锁餐企要抢酒楼的婚宴生意?
  • 巴基斯坦关闭全部领空
  • 康子兴评《文明的追求》|野人脚印:鲁滨逊的恐惧与文明焦虑
  • 司法部谈民营经济促进法:对违规异地执法问题作出禁止性规定
  • 动物只有在被认为对人类有用时,它们的建筑才会被特别设计
  • 创新创业50人论坛开幕在即,双创青年为何选择来上海筑梦?