Android NDK在v5版本后不再提供全部的POSIX线程库的API(比如pthread_cancel和pthread_setcancelstate)。原因之一是线程被标记结束后不一定会把自己拥有的资源释放掉,甚至不一定会结束,因此很可能造成内存泄露或死锁等问题,而这些问题在移动设备上更加突出[1]。

比较安全的方法是使用更安全pthread_kill函数代替,有关pthread_kill的功能讲解和替换方式可以参见这篇博客。

此处仅记录ffmpeg编译android版本时对应的问题及解决。使用ndk-r14b编译arm64时报错:

libavformat/udp.c: In function 'circular_buffer_task_rx':

libavformat/udp.c:499:5: error: implicit declaration of function 'pthread_setcancelstate' [-Werror=implicit-function-declaration]

pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_cancelstate);

^

libavformat/udp.c:499:28: error: 'PTHREAD_CANCEL_DISABLE' undeclared (first use in this function)

pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_cancelstate);

^

libavformat/udp.c:499:28: note: each undeclared identifier is reported only once for each function it appears in

libavformat/udp.c:513:32: error: 'PTHREAD_CANCEL_ENABLE' undeclared (first use in this function)

pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old_cancelstate);

^

libavformat/udp.c: In function 'circular_buffer_task_tx':

libavformat/udp.c:561:28: error: 'PTHREAD_CANCEL_DISABLE' undeclared (first use in this function)

pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_cancelstate);

^

libavformat/udp.c:596:32: error: 'PTHREAD_CANCEL_ENABLE' undeclared (first use in this function)

pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old_cancelstate);

^

libavformat/udp.c: In function 'udp_close':

libavformat/udp.c:1142:13: error: implicit declaration of function 'pthread_cancel' [-Werror=implicit-function-declaration]

pthread_cancel(s->circular_buffer_thread);

解决方案:修改ffmpeg/libavformat/udp.c文件函数开始部分,添加:

#define SIG_CANCEL_SIGNAL SIGUSR1

#define PTHREAD_CANCEL_ENABLE 1

#define PTHREAD_CANCEL_DISABLE 0

typedef long pthread_t;

static int pthread_setcancelstate(int state, int *oldstate) {

sigset_t new, old;

int ret;

sigemptyset (&new);

sigaddset (&new, SIG_CANCEL_SIGNAL);

ret = pthread_sigmask(state == PTHREAD_CANCEL_ENABLE ? SIG_BLOCK : SIG_UNBLOCK, &new , &old);

if(oldstate != NULL)

{

*oldstate =sigismember(&old,SIG_CANCEL_SIGNAL) == 0 ? PTHREAD_CANCEL_DISABLE : PTHREAD_CANCEL_ENABLE;

}

return ret;

}

static inline int pthread_cancel(pthread_t thread) {

return pthread_kill(thread, SIG_CANCEL_SIGNAL);

}

另:在Android NDK中是没有libpthread.a的,有关的功能实现已经被集成到了libc.a中,所以使用时不需要使用-lpthread,而应该使用-lc链接参数。

附:ffmpeg添加libdavs2模块并合并成一个.so文件输出的arm64版编译脚本:

#!/bin/sh

build_dir=$(pwd)

AVS2SRC=$build_dir/cavs2dec_lib # path to libdavs2 install dictionary

ARCH=arm64

SDK_VERSION=21

NDK="/Android/android-ndk-r14b"

export PKG_CONFIG_PATH=$AVS2SRC/lib/pkgconfig

if [ "$ARCH" = "arm64" ]

then

PLATFORM_PREFIX="aarch64-linux-android-"

HOST="aarch64"

PLATFORM_VERSION=4.9

EXTRA_CFLAGS="-march=armv8-a -O3 -D__ARM_ARCH_7__ -D__ARM_ARCH_7A__ -DPIC \

-flax-vector-conversions -Wunused-variable -fPIE -pie -pthread"

else

PLATFORM_PREFIX="arm-linux-androideabi-"

HOST="arm"

PLATFORM_VERSION=4.9

EXTRA_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon -marm -mtune=cortex-a8 -D__ARM_ARCH_7__ -D__ARM_ARCH_7A__ \

-flax-vector-conversions -Wunused-variable -fPIE -pie"

fi

NDKROOT=$NDK/platforms/android-${SDK_VERSION}/arch-${ARCH}

TOOLCHAIN=$NDK/toolchains/${PLATFORM_PREFIX}${PLATFORM_VERSION}/prebuilt/linux-x86_64

CROSS_PREFIX=$TOOLCHAIN/bin/${PLATFORM_PREFIX}

EXTRA_LDFLAGS="-fPIE -pie -llog -landroid -shared"

# cp $NDKROOT/usr/include/linux/sysctl.h $NDKROOT/usr/include/sys/sysctl.h

build_one(){

./configure \

--target-os=linux \

--prefix=$build_dir/avs2_lib \

--enable-cross-compile \

--extra-libs="-lgcc -lstdc++ -lc" \

--arch=$ARCH \

--cross-prefix=$CROSS_PREFIX \

--cc=${CROSS_PREFIX}gcc \

--nm=${CROSS_PREFIX}nm \

--sysroot=$NDKROOT \

--extra-cflags="-I$NDKROOT/usr/include -I$AVS2SRC/include -O3 -fpic \

-DANDROID -DHAVE_SYS_UIO_H=1 -Dipv6mr_interface=ipv6mr_ifindex -fasm \

-Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300 \

-DHAVE_CLOSESOCKET=0 -fvisibility=hidden -fdata-sections -ffunction-sections $EXTRA_CFLAGS" \

--extra-ldflags="-Wl,-rpath-link=$NDKROOT/usr/lib -L$NDKROOT/usr/lib -lc \

-lm -ldl -llog -lstdc++ $AVS2SRC/lib/libdavs2.a -L$AVS2SRC/lib -ldavs2 \

$EXTRA_LDFLAGS" \

--enable-gpl \

--enable-libdavs2 \

--disable-shared \

--enable-static \

--disable-linux-perf \

--enable-pic \

--disable-armv5te \

--disable-armv6 \

--disable-armv6t2 \

--pkg-config=pkg-config

}

cd FFmpegAVS2

make distclean

build_one

make -j16 && make install

# use to package all part into single .so lib

${CROSS_PREFIX}ld -z muldefs -rpath-link=$NDKROOT/usr/lib \

-L$NDKROOT/usr/lib -L$PREFIX/lib -soname libffmpeg.so -shared -nostdlib -Bsymbolic \

--whole-archive --no-undefined -o $AVS2SRC/libffmpeg.so $AVS2SRC/lib/libdavs2.a \

libavcodec/libavcodec.a libavfilter/libavfilter.a libswresample/libswresample.a \

libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a \

libpostproc/libpostproc.a libavdevice/libavdevice.a -fPIC -lc -lm -lz -ldl -llog \

$NDK/sources/cxx-stl/gnu-libstdc++/4.9/libs/arm64-v8a/libgnustl_shared.so -lstdc++ \

--dynamic-linker=/system/bin/linker $TOOLCHAIN/lib/gcc/aarch64-linux-android/4.9.x/libgcc.a

android linux pthread_cancel,Android NDK缺失pthread_cancel和pthread_setcancelstate相关推荐

  1. linux 连接 android,linux下android连接真机测试

    1.首先手机不插电脑运行命令:lsusb 出现: 1 Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1root hub2 Bus 006 De ...

  2. Android Linux内核编译调试

    对于在Windows上写代码写习惯的人,调试是必不可少的手段,但是转到Android以后,发现调试手段异常简陋,跟Windows简直不是一个级别,特别是Android的内核调试,网上资料也相对较少,不 ...

  3. [Android]Linux下WebRTC下载与编译

    1.硬盘空间: WebRTC官方原话: The checkout size is large due the use of the Chromium build toolchain and many ...

  4. DirtyCow漏洞复现(脏牛、大脏牛、Linux、Android、提权)

    编译好的EXP下载地址: https://github.com/Brucetg/DirtyCow-EXP 该漏洞是 Linux 内核的内存子系统在处理写时拷贝(Copy-on-Write)时存在条件竞 ...

  5. ldflags android,Android 开发手记一 NDK编程实例

    Android开发手记一 ---- NDK编程实例 在Android上,应用程序的开发,大部分基于Java语言来实现.要使用c或是c++的程序或库,就需要使用NDK来实现.NDK是Native Dev ...

  6. android jni不适用ndk,Android NDK编译之undefined reference to 'JNI_CreateJavaVM'

    利用Android NDK编译动态库,在C文件中调用了两个JNI函数:JNI_GetDefaultJavaVMInitArgs和JNI_CreateJavaVM.编译的时候始终报以下错误: XXX: ...

  7. window和linux和android进程内存CPU等监控软件

    1.面向window和linux和android三个平台. 2.线程可监控物理内存,虚拟内存,CPU和GPU等占用情况. 3.输出结果保存为exls或者csv可进行图形化分析 下载地址:下载地址

  8. Android:JNI 与 NDK到底是什么

    前言 在Android开发中,使用 NDK开发的需求正逐渐增大 但很多人却搞不懂 JNI 与 NDK 到底是怎么回事 今天,我将先介绍JNI 与 NDK & 之间的区别,手把手进行 NDK的使 ...

  9. Android(Linux)实时监控串口数据

    之前在做WinCE车载方案时,曾做过一个小工具TraceMonitor,用于显示WinCE系统上应用程序的调试信息,特别是在实车调试时,用于监控和显示CAN盒与主机之间的串口数据.因为需要抢占市场先机 ...

最新文章

  1. 吴恩达深度学习笔记(83)-LeNet-5、AlexNet和VGGNet网络知多少
  2. 【Android FFMPEG 开发】Android Studio 中 配置 FFMPEG 库最小兼容版本 ( undefined reference to 'atof' )
  3. Android下的数据存储与访问、权限
  4. Spring boot配置Dubbo三种方式
  5. spring项目中加载配置文件
  6. 如何用JS获取页面上的所有标签
  7. xargs 命令教程
  8. 信息学奥赛一本通 1051:分段函数 | OpenJudge NOI 1.4 13
  9. 9-12 原生安装4
  10. sqlserver备份后无法还原的解决方法
  11. 【Mac】nsurlsessiond 后台下载问题的解决方法
  12. 毕业论文答辩ppt怎么做?
  13. 综述类论文怎么写引言和结语?
  14. 科创人·知乎CTO李大海:技术服务内容、商业化依赖内容,曾被「呵呵」难到挠头
  15. 八大基本数据类型之基本类型与包装类型的区别
  16. CEO年薪过亿,谁说了算?
  17. 如何使用电脑在线制作闪图?
  18. Spark数据倾斜解决方案(收藏级)
  19. 用预处理指令#define 声明一个常数,用以表明一年中有多少秒
  20. Java培训还是自学

热门文章

  1. 几行 Java 代码搞定图片提取文字功能
  2. 解决httpClient 调用返回“ ip:port fail to respond ” 问题
  3. 【20221220】Windows通过网线共享网络及小猫咪局域网共享
  4. modelnet40介绍_三维形状数据的深度特征表示
  5. jquery表单ajax json数据,jquery序列化form表单使用ajax提交后处理返回的json数据
  6. CodeForces - 1213A Chips Moving (思维 数学)
  7. [附源码]Nodejs计算机毕业设计科技类产品众筹系统Express(程序+LW)
  8. SimpleDateFormat日期转换之12小时和24小时制
  9. [刷题]leetcode\977_有序数组的平方
  10. [bzoj3698]XWW的难题——有上下界的最大流