安卓Native层的多线程调用以及堆栈打印

您所在的位置:网站首页 安卓displaymanager打印 安卓Native层的多线程调用以及堆栈打印

安卓Native层的多线程调用以及堆栈打印

2023-05-21 02:35| 来源: 网络整理| 查看: 265

Linux里面自带的多线程方案-posix

thread_posix.c

#include #include #include #include void *thread_posix_function(void *arg) { (void*)arg; int i; for ( i=0; i pthread_t mythread; if ( pthread_create( &mythread, NULL, thread_posix_function, NULL) ) { ALOGD("error creating thread."); abort(); } if ( pthread_join ( mythread, NULL ) ) { ALOGD("error joining thread."); abort(); } ALOGD("hello thread has run end exit\n"); exit(0); }

创建Android.mk

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := MyThread.cpp \ Main.cpp \ LOCAL_SHARED_LIBRARIES :=libandroid_runtime \ libcutils \ libutils \ liblog LOCAL_MODULE := android_thread LOCAL_PRELINK_MODULE := false include $(BUILD_EXECUTABLE)

根据LOCAL_MODULE 名称编译,由于没有进行打包,将生成的文件push到机器data/local文件夹下,然后执行该文件

安卓里面Native层自带的多线程类-Thread

MyThread.h 它是声明的一个头文件

#ifndef _MYTHREAD_H #define _MYTHREAD_H #include namespace android { class MyThread: public Thread { public: MyThread(); virtual void onFirstRef(); virtual status_t readyToRun(); //如果返回true,循环调用此函数,返回false下一次不会再调用此函数 virtual bool threadLoop(); virtual void requestExit(); private: int hasRunCount = 0; }; } #endif

MyThread.cpp 它是MyThread.h的实现

#define LOG_TAG "MyThread" #include #include "MyThread.h" namespace android { MyThread::MyThread() : Thread(false) { ALOGD("MyThread"); } bool MyThread::threadLoop() { ALOGD("threadLoop hasRunCount = %d",hasRunCount); hasRunCount++; if (hasRunCount == 10) { return false; } return true; } void MyThread::onFirstRef() { ALOGD("onFirstRef"); } status_t MyThread::readyToRun() { ALOGD("readyToRun"); return 0; } void MyThread::requestExit() { ALOGD("requestExit"); } }

Main.cpp

#define LOG_TAG "Main" #include #include #include "MyThread.h" using namespace android; int main() { sp thread = new MyThread; thread->run("MyThread", PRIORITY_URGENT_DISPLAY); while(1) { if (!thread->isRunning()) { break; } } ALOGD("main end"); return 0; }

sp是Android中的智能指针。智能指针是C++中的一个概念,通过基于引用计数的方法,解决对象的自动释放的问题。 Android.mk

LOCAL_PATH := $(call my-dir) LOCAL_PRELINK_MODULE := false include $(BUILD_EXECUTABLE) include $(CLEAR_VARS) LOCAL_SRC_FILES := thread_posix.c LOCAL_MODULE := linux_thread LOCAL_SHARED_LIBRARIES :=liblog LOCAL_PRELINK_MODULE := false include $(BUILD_EXECUTABLE)

Android native的Thread类是Android提供的一个基础类,源码路径: system\core\libutils\include\utils\Thread.h system\core\libutils\Threads.cpp 该类提供的基础功能涵盖了线程的生命周期:创建、运行、销毁。主要成员函数如下: 0、本身继承于RefBase,所以具有相应的一些特性 // Invoked after creation of initial strong pointer/reference. virtual void onFirstRef(); 1、执行线程创建并启动运行,通过run方法(和java有点差异): status_t run(const char name, int32_t priority, size_t stack); 2、循环执行方法 2.1 先执行readyToRun() 2.2 创建完成后,开始执行_threadLoop()函数,该函数主要通过调用threadLoop()函数,因此基类必要要实现threadLoop函数,作为线程执行函数,它是有返回值的方法,而且_threadLoop会根据返回值确定是否继续循环执行的方法。 3、线程请求退出方法 线程销毁,子类最好通过实现requestExit()函数,首先调用Thread类的requestExit()函数,将线程状态mExitPending置为true,然后中断threadLoop:*

安卓里面Native层打印堆栈

1、进入对应的cpp文件,放开#define LOG_NDEBUG 0注释,且变成#define LOG_NDEBUG 1

2、声明头文件 #include #include

3、调用方法: android::CallStack stack; stack.update(); stack.log(“lijunbo”); //输出到logcat

4、mk或者bp中需要链接以下so库: libutils libcutils



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3