首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android NDK中的UI线程

概述 在Android中,UI线程是一个很重要的概念。我们对UI的更新和一些系统行为,都必须在UI线程(主线程)中进行调用。...同时,我们在进行底层跨平台开发时,我们会选择NDK,在Linux系统上进行开发。在Linux中是没有主线程这一概念的。...那么,如果我们在子线程调用了一个native方法,在C++的代码中,我们想要切换到主线程调用某个方法时,该如何切换线程呢? 需求 众所周知,Toast消息,是无法在子线程调用的。...通过初始中的这样两个方法,我们就构建了一条通往主线程的通道。 发往主线程 在初始化的方法中,我们构筑了一条消息通道。接下来,我们就需要将消息发送至主线程。...目前,我能够想到的是,根据内容,在handle_message中实现“解包”。 总结 在native层,想要切到主线程调用方法。其根本是在应用启动时,就在主线程调用初始化,构建好一个消息通道。

2.6K40

Android JNI(一)——NDK与JNI基础

总之,在Android的SDK之外,有一个工具就是NDK,用于进行C/C++的开发。一般情况,是用NDK工具把C/C++编译为.co文件,然后在Java中调用。...因为C语言的不跨平台,在Mac系统的下使用NDK编译在Linux下能执行的函数库——so文件。其本质就是一堆C、C++的头文件和实现文件打包成一个库。...因此,不同的线程的JNIEnv是不同,也不能相互共享使用。JNIEnv结构也是一个函数表,在本地代码中通过JNIEnv的函数表来操作Java数据或者调用Java方法。...JNIEnv是一个线程相关的结构体,该结构体代表了Java在本线程的执行环境 2.2、JNIEnv和JavaVM的区别: JavaVM:JavaVM是Java虚拟机在JNI层的代表,JNI全局仅仅有一个...所以JNIEnv不能跨线程。

3.7K32
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Android FFMPEG 开发】C++ 回调 Java 方法 模板 ( JavaVM *vm | JNIEnv *env | jobject instance | 引用类型 | 模板代码示例 )

    前置知识点 : 参考 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 ) 博客内容 , 了解如何在 C++ 中调用...JavaVM *vm ---- JavaVM *vm 获取方法 : 在 JNI_OnLoad() 方法中获取 ; //JNI_OnLoad 中获取的 Java 虚拟机对象放在这里 JavaVM *javaVM...局部引用 与 全局引用 : JavaVM *vm , JNIEnv *env 与 jobject instance 是在方法中获取的 , 如果跨线程调用 , 就需要考虑其引用的类型 , 局部引用 或 全局引用...参考 : ① 局部引用 : 【Android NDK 开发】JNI 引用 ( 局部引用 | 局部引用作用域 | 局部引用产生 | 局部引用释放 | 代码示例) ② 全局引用 : 【Android NDK...vm->DetachCurrentThread(); 参考 : 【Android NDK 开发】JNI 线程 ( JNI 线程创建 | 线程执行函数 | 非 JNI 方法获取 JNIEnv

    1K20

    Android NDK开发完全剖析

    之前的两篇文章主要介绍了音视频SDK中的线程设计和消息队列,其实对那些想从Android转向音视频开发的同学来说,NDK方面的知识是不得不提的“前置条件”,因为音视频开发的主要是C/C++开发,也许有些同学会反驳...我们这边需要着重记住的就是JavaVM在一个进程中只存在一个,这个很重要,JNI多线程需要这个作为基础。...JNIEnv 对应的是线程,一个线程对应一个JNIEnv对象,在JNI多线程操作中,一定要注意切换到当前线程的JNIEnv,因为JNIEnv用于线程本地存储,无法在线程之间共享JNIEnv, 那怎么获取当前线程的...JNI多线程: 我们经常遇到的一个场景是,在JNI中可能会开启一个线程,如何回调到Java层来?...还记得我们上面说到了JavaVM,在Android中一个进程保持一个JavaVM实例,说明JavaVM是进程间共享的,那我们在JNI_OnLoad的时候需要将当前进程的JavaVM保存起来。

    1.9K10

    JNI 从入门到实践,万字爆肝详解!

    本文已收录到 GitHub · Android-NoteBook[1] 中。 前言 在 Android 生态中主要有 C/C++、Java、Kotlin 三种语言 ,它们的关系不是替换而是互补。...JavaVM 对象,JavaVM 可以跨线程共享; JNIEnv: 代表 Java 运行环境,每个 Java 线程都有各自独立的 JNIEnv 对象,JNIEnv 不可以跨线程共享。...由于 JavaVM 是进程共享的,因此全局引用可以跨方法和跨线程共享; JavaEnv 内有 locals 表管理局部引用,由于 JavaEnv 是线程独占的,因此局部引用不能跨线程。...7.1 不能跨线程的引用 在 JNI 中,有 2 类引用是无法跨线程调用的,必须时刻谨记: JNIEnv: JNIEnv 只在所在的线程有效,在不同线程中调用 JNI 函数时,必须使用该线程专门的 JNIEnv...,不能跨线程使用。

    2.4K21

    【Android NDK 开发】在 C 代码中获取 Android 系统信息 ( NDK 项目创建 | NDK 配置 | 获取 Android 系统版本号 )

    创建 NDK 项目 II . NDK 项目 相关配置 III . NDK 中获取 Android 版本号 IV . 使用 __system_property_get 可获取的参数 I ....创建支持 NDK 的项目 : 当前最新的 Android Studio 支持直接创建 支持 C/C++ 的带 NDK 配置的项目 ; 如果向现有项目加入 C/C++ 代码 , 首先要创建 cpp 代码文件..., 然后创建 CMakeList.txt 编译脚本 , 最后在 build.gradle 中配置该编译脚本 , 这里不再详细描述 ; 在菜单栏中选择 File -> New -> New Project...NDK 中获取 Android 版本号 ---- 1....参数字符串来源 : 上述的参数字符串都定义在 Android 系统中的 build.prop 配置文件中 ; 4.

    2K20

    【Android 系统开发】Android JNI 之 JNIEnv 解析

    .jni.h文件 : 了解 JNI 需要配合 jni.h 文件, jni.h 是 Google NDK 中的一个文件, 位置是 $/android-ndk-r9d/platforms/android-19...JNIEnv 作用 JNIEnv 概念 : 是一个线程相关的结构体, 该结构体代表了 Java 在本线程的运行环境 ;  JNIEnv 与 JavaVM : 注意区分这两个概念;  -- JavaVM...: JavaVM 是 Java虚拟机在 JNI 层的代表, JNI 全局只有一个; -- JNIEnv : JavaVM 在线程中的代表, 每个线程都有一个, JNI 中可能有很多个 JNIEnv; JNIEnv...JNIEnv 体系结构  线程相关 : JNIEnv 是线程相关的, 即 在 每个线程中 都有一个 JNIEnv 指针, 每个JNIEnv 都是线程专有的, 其它线程不能使用本线程中的 JNIEnv,...线程 A 不能调用 线程 B 的 JNIEnv; JNIEnv 不能跨线程 :  -- 当前线程有效 : JNIEnv 只在当前线程有效, JNIEnv 不能在 线程之间进行传递, 在同一个线程中,

    31631

    Android跨进程通信IPC之3——关于JNI的那些事

    其实不少的Java的程序员,享受着其跨平台性,可能全然不知JNI的存在。在Android平台,让JNI大放异彩,为更多的程序员所数值,往往为了提供效率或者其他功能需求,就需要在NDK上开发。...第一个参数会传入JavaVM指针;第二种方式,在native_code中调用JNI_CreateJavaVM(&jvm,(void*)&env,&vm_args) 可以得到JavaVM指针。...但是,一个本地方法可能会被不同的Java线程调用,因此可以接受不同的JNIEnv。 和JNIEnv相比,JavaVM可以在进程中各个线程间共享。...需要强调在Android SDK中强调了额 " do not cache JNIEnv * ",要用的时候在不同的线程中通过JavaVM * jvm的方法来获取与当前线程相关的JNIEnv *。...在Java里,每一个一个process可以产生多个JavaVM对象,但是在android上,每一个process只有一个Dalvik虚拟机对象,也就是在android进程中是通过有且只有一个虚拟机对象来服务所有

    2.6K50

    NDK学习笔记:线程JNIEnv,JavaVM,JNI_OnLoad(GetEnv返回NULL?FindClass返回NULL?)

    NDK学习笔记:线程JNIEnv,JavaVM,JNI_OnLoad 此文章是关于NDK线程的第二篇理论知识笔记。...线程中如何获取JNIEnv?GetEnv返回NULL? FindClass返回NULL ?...为了配合这种多执行绪的环境,C组件开发者在撰写native函数时,可藉由JNIEnv指标值之不同而避免执行绪的资料冲突问题,才能确保所写的native函数能安全地在Android的多执行绪VM里安全地执行...这里的JavaVM就是虚拟机VM在JNI中的表示,一个进程JVM中只有一个JavaVM对象,这个对象是线程共享的。...既然env不是线程安全,不能直接引用。那么我们可以引用其他线程共享的调用对象啊,再通过GetObjectClass获取jclass。

    2.8K41

    NDK开发(九) :Hello jniCallback

    转载请以链接形式标明出处: 本文出自:103style的博客 本文操作以 Android Studio 3.5 版本为例 本文为参考官方示例 hello-jniCallback 动手写的 Demo.... ---- NDK开发(一) :NDK入门指南 NDK开发(二) :JNI的数据类型 NDK开发(三) :JNI访问Java变量和方法 NDK开发(四) :JNI操作Java数组 NDK开发(五) :...JNI实现文件加解密 NDK开发(六) :JNI实现文件拆分和合并 NDK开发(七) :JNI实现文件夹遍历 NDK开发(八) :JNI下Bitmap的使用 NDK开发(九) :Hello JniCallback...: 通过pthread_create创建线程的时候,第一个参数:线程id的指针;第二个参数:线程属性的指针;第一个参数:在线程中运行的函数;第四个参数:运行函数的参数 extern "C" JNIEXPORT...NewGlobalRef(clz)); jniCallback.jniCallbackDemoObj = env->NewGlobalRef(instance); // StartTiming :在线程中运行的函数

    35130

    JNI线程相关

    注:Android develop中给的的编码建议是: 尽可能避免在使用受管理编程语言编写的代码与使用 C++ 编写的代码之间进行异步通信。这样可使 JNI 接口更易于维护。...一种比较常见的应用场景是:在native 层创建了线程,线程执行完后想将结果返回给java层,这时线程是不能用jni函数参数中的JNIEnv的,因为参数中的JNIEnv属于不同的线程....在线程中获取或创建JNIEnv 分两种情况 线程中包含JNIEnv 如果一段代码无法通过其他方法获取自己的 JNIEnv,您应该共享相应 JavaVM,然后使用 GetEnv 发现线程的 JNIEnv...会阻止GC回收所引用的对象,不能在本地函数中跨函数使用,不能跨线前使用。 函数返回后局部引用所引用的对象会被JVM自动释放....可以跨方法、跨线程使用。

    1.4K20

    Android JNI出坑指南

    在Android编程中,出于硬件交互,跨平台,安全性,第三方库等方面的考虑,我们需要Java与C/C++互相调用,这就需要借助Java平台的JNI接口(Java Native Interface)。...Android早期版本因JNI调用性能,native代码调试困难而被诟病,但近年来性能已经有不错的优化,Android NDK对C++开发支持也越来越好,特别是在Android Studio上开发调试C...未调用DetachCurrentThread导致线程无法正常退出 在natvie线程中调用了AttachCurrentThread连接到虚拟机,但线程退出前未调用DetachCurrentThread取消连接...该指针只在创建它的线程有效,不能跨线程传递。...Google官方JNI指南文档建议在Android2.0以上可使用pthread_key,在线程析构时自动调用Detach以简化操作。

    4.4K71

    你应该了解的JNI知识(三)——注意点

    共享库中的,要使用该功能,需要在cmake中引入库。...全局引用和局部引用 试想一种场景,在JNI_OnLoad中通过FindClass找到某一个类,然后用作静态变量,在以后某个场景使用该静态场景,一些是不是设想的很美好,但在JNI环境中是不行的。...会阻止GC回收所引用的对象,不在本地函数中跨函数使用,不能跨线程使用。函数返回后局部引用所引用的对象会被JVM自动释放,或调用DeleteLocalRef释放。...可以跨方法、跨线程使用。JVM不会自动释放,必须调用DeleteGlobalRef手动释放。...弱全局引用:调用NewWeakGlobalRef基于局部引用或全局引用创建,不会阻止GC回收所引用的对象,可以跨方法、跨线程使用。

    1.3K70

    Radare2静态分析apk

    Android的so文件 在前面的文章中,对so文件进行了基本的介绍。Android的so有点不一样。...JNIEnv基础 1.线程相关 : JNIEnv 是线程相关的, 即 在 每个线程中 都有一个 JNIEnv 指针, 每个JNIEnv 都是线程专有的, 其它线程不能使用本线程中的 JNIEnv, 线程...JNIEnv 不能跨线程 : •当前线程有效 : JNIEnv 只在当前线程有效, JNIEnv 不能在 线程之间进行传递, 在同一个线程中, 多次调用 JNI层方法, 传入的 JNIEnv 是相同的;...env指针指向一个函数指针表,在VC中可以直接用"->"操作符访问其中的函数。...参数: utf UTF编码的字符串指针,对于数值型参数,在C/C++中可直接使用 JNIEnv编程 通过ANdroid studio 新建c++项目,需要下载ndk和CMakelist。

    90930

    【Android NDK 开发】JNI 线程 ( JNI 线程创建 | 线程执行函数 | 非 JNI 方法获取 JNIEnv 与 Java 对象 | 线程获取 JNIEnv | 全局变量设置 )

    线程方法获取 JNIEnv ---- 线程中获取 JNIEnv * env 步骤 : ① JNIEnv 无法跨线程 : JNI 方法参数中的 JNIEnv 指针是不能跨线程使用的 , 在 主线程中调用...代码示例 : /* 线程执行的方法 如果在 Native 层执行耗时操作 , 如下载文件 , 需要在线程中处理 JNI 方法参数中的 JNIEnv 指针是不能跨线程使用的 ,...在 主线程中调用 JNI 方法 , 其 JNIEnv 指针不能在子线程中使用 如果在子线程中使用 JNIEnv 指针 , 需要使用 JavaVM 获取 指定线程的 JNIEnv 指针...> //Java 虚拟机指针 , 在 JNI_OnLoad 方法中设置该值 JavaVM *_vm; //JNI 方法参数中的第二个参数 , 需要先将局部变量转为全局变量 , 然后再其它方法中调用..., 在 主线程中调用 JNI 方法 , 其 JNIEnv 指针不能在子线程中使用 如果在子线程中使用 JNIEnv 指针 , 需要使用 JavaVM 获取 指定线程的 JNIEnv 指针

    93720

    JNI编程如何巧妙获取JNIEnv

    JavaVM:Java虚拟机在Native层的代表,在Android中一个进程只有一个JavaVM,所有的线程共用一个JavaVM。...JNIEnv:Java调用Native语言的环境,是一个封装了几乎所有JNI方法的指针,每一个Java线程都有一个对应的JNIEnv,JNIEnv只在当前线程可用,不能跨线程使用,不同线程的JNIEnv...在Native环境中创建的线程,如果需要调用JNI方法,必须要调用AttachCurrentThread()与JVM进行关联,使用后也需要调用DetachCurrentThread()来解除关联。...小总结: 在Android进程中,在Native层,通过任何一个可用的JNIEnv都可以获取到整个进程唯一的JavaVM,在任何线程中都可以通过JavaVM获取当前线程可用的JNIEnv,如果是Native...方法一:在Android中调用Native方法前通常都会先加载Native的动态链接库,通常都是使用这种方法: System.loadLibrary(xxx); 这个方法调用后Native层会自动调用

    4.8K30
    领券