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

Android JNI线程操作

线程附着在 Java 虚拟机上 在上面的线程启动函数中,只是简单执行了打印 log 操作,如果想要执行和 Java 相关操作,比如从 JNI 调用 Java 函数等等,那就需要用到 Java...虚拟机环境了,也就是用到 JNIEnv 指针,毕竟所有的调用函数都是以它开头。...pthread_create 创建线程是一个 C++线程,虚拟机并不能识别它们,为了和 Java 空间交互,需要先把 POSIX 线程附着到 Java 虚拟机上,然后就可以获得当前线程 JNIEnv...AttachCurrentThread 方法是由 JavaVM 指针调用,它代表是 Java 虚拟机接口指针,可以在 JNI_OnLoad 加载时来获得,通过全局变量保存起来 static JavaVM...&handles, NULL, run, (void *) threadRunArgs); 通过这样调用,就可以在 Native 线程调用 Java 相关函数了。

1.1K20

Android JNI 调用异常处理

Android JNI 调用异常主要有如下两种: Native 代码调用 Java 层代码时发生了异常要处理 Native 代码自己抛出了一个异常让 Java 层去处理 可以看到异常发生和处理基本都需要...Native 和 Java 交互,而对于 Native 自身出了异常,也就是 C/C++ 代码有问题,导致应用崩溃又是另一回事了。...Native 调用 Java 方法时异常 之前博客中就讲述了如何 Native 调用 Java 方法,先准备一个有异常方法供 Native 去调用。...不过,我们这样仅仅是消除了这次异常,还应该让调用者有异常发生,那么就需要通过 Native 来抛出一个异常告诉 Java 调用者了。...Native 抛出异常代码大致都是相同,可以抽出一个通用函数来: void throwByName(JNIEnv *env, const char *name, const char *msg) {

1.8K20
您找到你想要的搜索结果了吗?
是的
没有找到

Android NDK中UI线程

概述 在Android中,UI线程是一个很重要概念。我们对UI更新和一些系统行为,都必须在UI线程(主线程)中进行调用。...在Linux中是没有主线程这一概念。 那么,如果我们在子线程调用了一个native方法,在C++代码中,我们想要切换到主线程调用某个方法时,该如何切换线程呢?...需求 众所周知,Toast消息,是无法在子线程调用。如果我们在子线程中执行C++代码,此时想调用toast方法,该如何是好呢?...只是在调用之前,做了线程转换,在C++线程调用了toast。...简单来讲,当我们在自己创建线程想要通过JVM获取Class时,Android会为我们启动系统ClassLoader而不是我们AppClassLoader。

2.4K40

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

关于函数指针参数说明 : C++函数指针类型是 void *(PTW32_CDECL *start) (void *) 函数参数类型是 void* 指针 ; 函数返回值类型 void* 指针...线程执行函数 ---- 1. 线程执行函数要求 : C++ 中规定线程执行函数函数指针类型是 void *(PTW32_CDECL *start) (void *) ; 2....代码示例 : /* 定义线程中要执行方法 将该函数指针作为线程创建方法 pthread_create 第三个参数 C++ 中规定线程执行函数函数指针类型是 void *(PTW32_CDECL...调用 JavaVM AttachCurrentThread 可以获取本线程 JNIEnv 指针 注意最后还要将线程 Java 虚拟机中剥离 关于参数传递...调用 JavaVM AttachCurrentThread 可以获取本线程 JNIEnv 指针 注意最后还要将线程 Java 虚拟机中剥离 关于参数传递 :

74120

初学JNI java中调用c++函数 helloworld实验

reference https://www.cnblogs.com/liuling/p/2013-12-20.html 简介 利用JNI可以让java代码调用c/c++代码。...很多时候,某些功能用Java无法实现,这时候我们就可以利用JNI调用C或者C++程序来实现。 比如说涉及到底层驱动一些功能,这就是JNI强大之处。...但是JNI也有它缺点,使用java与本地已编译代码交互,通常会丧失平台可移植性。 以下这个例子,是java调用c++输出hello world例子。也是我根据博客做实验记录。...项目结构 在Win32Project1.cpp中实现该函数。如下 // Win32Project1.cpp : 定义 DLL 应用程序导出函数。...运行结果 意外:Can't load AMD 64-bit .dll on a IA 32-bit platform 总结 在该实验中,我们用cpp去实现greeting函数,让java调用它输出了

95580

AndroidJNI【实战教程】1⃣️--java和c/c++那些事

JNI作用 JNI是Java Native interface缩写。JNI不是安卓特有的,是Java继承过来,但是在Android中,JNI作用大大增强了。...在Android中,java主要负责UI功能实现,而c/c++则负责完成一些复杂算法及底层交互功能,因此Android中java和c/c++交互特别的频繁。...所以有的人说android开发就是做java,真的是很可怕想法。 无论Java到c/c++,还是c/c++到java 中间都没有跨线程调用,两者在一个线程中,只是两者线程id表示不同而已。...java层线程id1开始,c/c++层实用是一个与线程相关数据结构指针,两者不能比较。 JNI用法 java到c/c++ 1....装载JNI动态链接库 为了使JNI在本地方法调用前吧c/c++代码所在动态库装载待进程内存空间中,装载库文件调用是SystemLoadLibrary()方法。

88960

AndroidUI设计与后台线程交互

本文将讨论Android应用程序线程模型以及如何使用线程来处理耗时较长操作,而不是在主线程中执行,保证用户界面(UI流畅运行。本文还将阐述一些用户界面(UI)中与线程交互API。...例如,当您触摸屏幕一个按钮时,UI线程会把触摸事件分发到组件,更改状态并加入事件队列,UI线程会分发请求和通知到各个组件,完成相应动作。...然面不幸是,它违反了用户界面单线程模型:Android用户界面工具包不是线程安全,只能在UI线程中操作它,在上面的代码中,你在一个工作线程调用mImageView.setImageBitmap(...Android提供了几种方法来其他线程访问UI线程。...◆您可以任何线程随时取消任务 不管你是否使用AsyncTask,时刻牢记单一线程模型两条规则: 1、不要锁住用户界面。 2、确保只在UI线程中访问Android用户界面工具包中组件。

95050

Android NDK 开发】JNI 方法解析 ( CC++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )

获取 jclass 对象 ( FindClass ) ---- 函数原型 : 通过传入完整 包名.类名 获取 Java 类对应 C/C++ 环境下 jclass 类型变量 ; 返回值 : 返回 Java...JNI 函数签名规则 ---- 参考 : JNI 函数签名规则 V . javap 获取函数签名 ( 推荐 ) ---- 自己写函数签名容易出错 , 还麻烦 , 推荐使用 javap 工具 ;...Android Studio 中 Java 代码编译后 class 字节码文件位置 : 不同版本 AS 编译后字节码位置不同 , 建议在各自 Module 下 build 目录中进行文件查找...; 如 : 要获取 kim.hsl.jni.Student 类中函数签名 , 使用 javap -s kim.hsl.jni.Student 命令 ; 5 ....对应 C/C++ jclass 类型对象 ) , Java 方法 ID , 及根据函数签名传入 参数列表 ( 可变参数 ) , 反射调用该 Java 对象方法 ; 返回值 : Void , 注意这里返回值可以是

8.1K40

cocos android分析

熟悉Android一看就发现,事实这本身就是一个Javaproject,我们刚才操作仅仅是当中jni部分,供Java以下调用实现而已 Eclipse中运行Build Project。...在2中调用jni里面的nativeRender实现一帧渲染。而GLSurfaceView则负责UI交互监听。 这样机制优点是在Java中Renderer渲染器是独立线程调用。...所以基本全部功能都是由C++层面来实现,一帧渲染,事件处理,而Java层主要负责逻辑处理,终于通过jni调用C++接口来实现。...怎么来理解这样窗体绑定方式,保证我如今调用gl函数,就行绘制在窗体呢,通篇没有一个类似的handleJava传递给JNI,通篇C++层面的View也仅仅是一个仅仅有Width和Height属性结构体...C++调用Java方式,在jni里面也提供了,呵呵。

1.5K20

详解Android应用main函数调用

VM_HOOKS.preFork()功能是停止Zygote4个Daemon子线程运行,确保Zygote是单线程,提升fork效率。当线程停止之后初始化gc堆。...,对应com_android_internal_os_Zygote.cppcom_android_internal_os_Zygote_nativeForkAndSpecialize,继续调用了ForkAndSpecializeCommon...函数在虚拟机是保存在栈中,每调用一个函数,就将函数相关数据压入栈;执行完函数,将函数栈中弹出。因此,栈底就是main函数。...在上面的研究中,新进程创建后,经历一系列函数调用才到main函数,如果直接调用main函数调用链中关于初始化函数会一直存在。...最后补充一点,handleChildProc函数开始,一系列过程调用了ActivityThreadmain函数,这不是启动App独有的,后续研究启动SystemServer进程时,你会发现逻辑都是一样

79320

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

NDK本身其实就是一个交叉工作链,包含了Android一些库文件,然后,NDK为了方便使用,提供了一些脚本,使得更容易编译C/C++代码。...,使用指令集,内存对齐到可用系统函数库。...oracle中关于JNI指导 Java调用C/C++在Java语言里面本来就有的,并非Android自创,即JNIJNI就是Java调用C++规范。...JNI结构.png 这张JNI函数组成就像C++函数表。虚拟机可以运行多张函数表,举例来说,一张调试函数表,另一张是调用函数表。JNI接口指针仅在当前线程中起作用。...层定义本地方法,能够在不同线程调用,因此能够接受不同JNIEnv 2.6、JNIEnv结构 JNIEnv是一个指针,指向一个线程相关结构,线程相关结构,线程相关结构指向JNI函数指针数组,这个数组中存放了大量

2K32

【 flutter 】2w 字详细解析引擎初始化、启动流程源码

FlutterEngine UI 交互转移到仅进行数据处理,然后又返回到 UI 交互能力。.../ios 实现对应 flutter_jni 类,那 android 举例就是 platform_view_android_jni.cc,这里面注册了 FlutterJNI 中调用 c/c++ 层实现...这个接口由近350个不同函数调用组成,用来绘制从简单图形比特到复杂三维景象。)...其实还有一个 platform 线程,指的是我们平台线程,拿 android 为例,就是我们 main 线程,那么四个线程是做什么用呢,这里简要分享一下: 注意:每个引擎有一份独立UI, GPU...因为长时间卡住Platform Thread有可能会被系统Watchdog程序强杀 UI Task Runner UI Task Runner用于执行Root Isolate代码,它运行在线程对应平台线程

1.1K10

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

方法 JNI层:Java声明Native方法部分 JNI函数:JNIEnv提供函数,这些函数jni.h中进行定义 JNI方法:Native方法对应JNI实现C/C++方法,即在jni目录中实现那些...虚拟机在从相同Java线程中对本地方法进行多次调用时,保证传递给本地方法接口指针是相同。但是,一个本地方方可以被不同Java线程调用,因此可以接受不同JNI接口指针。...所有的工作都是获取虚拟机接口开始。有两种方式:第一种方式,在加载动态链接库时,JVM会调用JNI_OnLoad(JavaVM * jvm, void * reserved)(如果定了该函数)。...函数时,调用Native函数线程必然通过Dalvik虚拟机来调用C层Native函数。...MediaPlayer", gMethods, NELEM(gMethods)); } 我们看到register_android_media_MediaPlayer()函数里面,实际调用AndroidRuntime

2.5K50

「音视频直播技术」JNI注意事项(一)

其中一个可以大幅提升性能办法就是使用JNI技术。也就是说将一些复杂,占CPU比较多模块、函数使用 C/C++来实现,Java再通过 JNI 接口调用 C/C++函数从而达到优化目的。...JNI JNI(Java Native Interface), 用于 Java 代码与 C/C++ 代码之间相互调用。之所以使用 JNI 主要还是效率角度出发。...JavaVM提供了调用接口函数,它允许你创建或销毁JavaVM。理论在同一个进程中你可以有多个JavaVM,但 Android 只支持一个。 JNIEnv提供了大部分 JNI 函数。...Threads 所有的线程都是 Linux 线程。他们一般情况下是 Thread.start启动。但它可以在任何地方创建,然后再绑定到 JavaVM。...也就是说Native代码必一次性执行完,Android没有打断Native代码执行方法。 通过JNI绑定线程在退出前,必须调用DetachCurrentThread函数

1.8K20

当Cocos2dx遇见Android,你猜猜

Cocos2dxRenderer.nativeRender();} 绘图方面我们需要注意:activity中view一般是在ui线程里绘制(surfaceView除外),跟android一样,cocos2dx...比如在cocos2dx里显示一个天气预报界面,点击城市选项弹出一个popwindow用来选择城市,注意因为popwindow是android窗口类,所以应该在ui线程显示。...一种容易想到方法是在popwindow中选完城市后dismis时通过jni调用c代码,在c代码里调用notify方法,在回调里做相关界面操作。...cocos2dxnode(游戏引擎中节点概念)update函数是运行在gl线程,这个过程根源是GLSurfaceViewonDrawFrame是在gl线程调用,在onDrawFrame里会调用...()方法,在end方法里我们可以看到,它实际是修改一个主循环里标志,从而让cocos2dx主循环退出,最后调用还是exit(0),没错,就是exit(0),直接退出整个进程。

1.8K20

React Native 新架构是如何工作

React 会将 React 元素简化为最终 React 宿主组件。每一次都会递归地调用函数组件 MyComponet ,或类组件 render 方法,直至所有的组件都被调用过。...该操作执行是 React(JavaScript)到渲染器(C++,大部分情况下是在 JavaScript 线程执行。...为此,Yoga 布局引擎调用了宿主平台函数来计算这些组件布局。...名词解释 Java Native Interface (JNI):一个用 Java 写 API,用于在 Java 中写 native(译注:指调用 C++) 方法。...在主线程中渲染 当 UI 线程上有高优先级事件时,渲染器能够在 UI 线程同步执行所有渲染流水线。 默认或连续事件中断 在这个场景中,UI 线程低优先级事件中断了渲染步骤。

2.7K10
领券