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

在最新的Android版本中,可以从一个类创建一个NewGlobalRef吗?

在最新的Android版本中,可以从一个类创建一个NewGlobalRef。

NewGlobalRef是JNI(Java Native Interface)提供的一种机制,用于在本地代码中创建全局引用。全局引用可以在整个应用程序的生命周期内保持有效,并且不会在Java对象的垃圾回收过程中被释放。

在Android中,可以使用NewGlobalRef从一个类创建一个全局引用。具体而言,可以通过调用NewGlobalRef函数来创建一个全局引用,并传入一个类对象作为参数。该函数将返回一个全局引用的指针,可以在本地代码中使用。

创建全局引用的优势在于,它可以确保在本地代码中持久地引用一个Java对象,即使该Java对象在Java层被垃圾回收了。这对于需要在本地代码中访问和操作Java对象的情况非常有用。

在Android应用程序开发中,可以使用NewGlobalRef来实现与JNI相关的功能,例如在本地代码中调用Java对象的方法或访问Java对象的字段。

关于NewGlobalRef的使用示例和更多详细信息,可以参考腾讯云的相关文档:

  • 腾讯云JNI开发指南:https://cloud.tencent.com/document/product/876/19707#.E5.85.A8.E5.B1.80.E5.BC.95.E7.94.A8
  • 腾讯云JNI相关API文档:https://cloud.tencent.com/document/product/876/19708#.E5.88.9B.E5.BB.BA.E5.85.A8.E5.B1.80.E5.BC.95.E7.94.A8
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

业务用例研究组织可以一个建设系统可以变化

2013-02-08 9:44:15 上孙安俊(359***041) 请问大家一个问题,业务用例研究组织可以一个建设系统可以变化?...2013-02-08 9:44:51 潘加宇(3504847) 没有必要变化了 2013-02-08 9:46:55 潘加宇(3504847) 这个划定范围,能把你要改进场景被包在里头就可以。...2013-02-08 9:48:41 上孙安俊(359***041) 如果想做一个部门业务管理系统, 2013-02-08 9:48:54 上孙安俊(359***041) 有时间,从部门外面,接报问题,...2013-02-08 9:51:42 潘加宇(3504847) 部门就可以了,把这些场景组织到部门用例下面 2013-02-08 9:54:44 潘加宇(3504847) 既然改进范围波及整个部门,...2013-02-08 11:11:15 潘加宇(3504847) 请假本身不是部门用例,但会影响部门某些用例实现,把请假作为一个场景放在这些用例下面。

2.7K30

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

JavaVM提供了调用接口函数,它允许你创建或销毁JavaVM。理论上一个进程可以有多个JavaVM,但 Android 只支持一个。 JNIEnv提供了大部分 JNI 函数。...绑定本地创建线程时会构造 java.lang.Thread对象,并把它添加到 "main"线程组(ThreadGroup),使得 debugger 可以知道它。...另外,因为每个进程只能有一个 JavaVM 限制,所以需要将数据存放在静态本地结构是合理引用(jclass),fieldID, methodID卸载前都是有效。...引用同一个对象有两不同引用值也是有可能。例如,同一对象上连续调用NewGlobalRef返回值可能不同。查看两引用是否指向同一个对象必须使用 IsSameObject 方法。...千万别使用 “==” 比较两引用。 一个后果是,本地代码你不能假定对象引用是不变或唯一

1.8K20
  • 你应该了解JNI知识(三)——注意点

    一个参数是优先级,和Log等级是对应,第二参数是tag,第三参数是log内容。 关于更多内容和方法可以参考log.h注释。...全局引用和局部引用 试想一种场景,JNI_OnLoad通过FindClass找到某一个,然后用作静态变量,以后某个场景使用该静态场景,一些是不是设想很美好,但在JNI环境是不行。...log_class = log_clazz; return JNI_VERSION_1_4; } Java端调用 这里定义一个native方法,去使用静态log,打印日志,如下代码: if...hl=zh_cn#kotlin 三种引用 JNI规范定义了三种引用:局部引用、全局引用、弱全局引用。 局部引用:通过NewLocalRef和各种JNI接口创建。...全局引用:调用NewGlobalRef基于局部引用创建,会阻止GC回收所引用对象。可以跨方法、跨线程使用。JVM不会自动释放,必须调用DeleteGlobalRef手动释放。

    1.2K70

    JNI开发,你需要知道一些建议

    它们本质上都是指向函数表指针指针(C++版本,它们被定义为,该类包含一个指向函数表指针,以及一系列可以通过这个函数表间接地访问对应JNI函数成员函数)。...JavaVM提供“调用接口(invocation interface)”函数, 允许使用者创建和销毁一个JavaVM。理论上可以一个进程拥有多个JavaVM对象,但Android只允许存在一个。...类型安全:从你Native代码返回了一个不兼容类型(比如说,从一个声明返回String方法却返回了StringBuilder)。...Native代码较好做法是: 一个静态初始化时调用System.loadLibrary(见之前一个例子,当中就使用了nativeClassInit)。...全局弱引用 Android 2.0(Eclair)之前,全局弱引用没有被实现。如果试图使用它们,老版本将完全不兼容。你可以使用Android平台版本号常量来测试系统支持性。

    1.4K30

    「音视频直播技术」看ijkplayer如何使用JNI

    前言 ijklayer可以说是目前最火一款移动端播放器了。它同时支持Android和iOS,是由著名B站开源播放器库,GitHub上有15.2K start。...它之所以如此流行,主要是代码写太美了,我认为把它当作艺术品也不过分。没看过它代码同学可以去了解一下。 ijkplayer为了提高性能做了大量优化,其中一个关键点是使用了JNI。...Android系统下,每一个进程只能有一个JavaVM。 我们第一步看下在ijkplayer里,如何通过 Java代码调到 C/C++接口。...C/C++调用Java方法 ijkplayer ,它会使用C调用android MediaCodec方法。我们就以这个为例子看一下它是如何从C调用java方法吧。...以上就是Signature表示方法规则! 看看下面一些Signature,你能一个转换为相应方法

    2.1K10

    Android 进阶解密笔记-JNI 基础

    :L+全名,.用/代替,比如java.lang.String就是Ljava/lang/String; 如果是数组类型:则在前面加上然后加类型签名,几位数组就加几个,比如int[]->[I,boolean...目录下javac/debug 生成class文件,找到 到地址 然后右键打开命令行 JNIEnv是native世界Java环境代表,通过JNIEnv *指针可以native世界访问Java世界代码操作...,它只创建线程有效,不能跨线程传递,因此不同是独立 作用: 调用Java方法 操作Java(操作Java变量和对象等) 局部引用、全局引用与弱引用比较 和Java引用类型一样,JNI也有引用类型...JNI规范指出,任何实现JNI规范JVM,必须确保每个本地函数至少可以创建16局部引用(可以理解为虚拟机默认支持创建16局部引用)。 局部引用不能跨线程使用,只创建线程有效。...不要试图一个线程创建局部引用并存储到全局引用,然后另外一个线程中使用。 全局引用 全局引用:只能调用NewGlobalRef基于局部引用创建,会阻GC回收所引用对象。可以跨方法、跨线程使用。

    53630

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

    函数多参数方案 : 如果线程执行函数有多个参数 , 可以使用结构体 , 进行封装 ; 6. 线程属性 : 创建线程时 , 给线程指定属性 pthread_attr_t 是结构体类型 ; 7....指针 函数返回值类型 void* 指针 函数多参数方案 : 如果线程执行函数有多个参数 , 可以使用结构体 , 进行封装 线程属性 : 创建线程时 , 给线程指定属性 pthread_attr_t...: 调用 JavaVM AttachCurrentThread 方法 , 可以绑定线程 , 其传入一个 JNIEnv ** 二维指针 , 会返回该线程对应 JNIEnv 指针 ; ④ 剥离线程...传递 int 类型 和 int * 类型 , 传递指针可以 方法修改 int 变量值 ; 传递 int * 类型 和 int ** 类型 , 传递二维指针 可以方法修改 int...使用域作用符访问全局 ::obj 变量 ::obj = env->NewGlobalRef(instance); //代表一个线程句柄 pthread_t pid;

    90720

    Android NDK开发完全剖析

    对于没有做过嵌入式开发的人来说,也许很陌生,一些Android开发,如果没有过多涉及JNI方面,也不太清楚什么是交叉编译,通俗来讲,交叉编译就是一个平台上生成另外一个平台可以执行代码。...创建一个包含native代码工程,主要关注这两结构: main目录下创建了cpp和java文件夹,cpp就是写native代码,java就是上层代码,其中cpp文件夹下面有一个CMakeLists.txt...: (ILjava/lang/String;)I 例如我们定义了一个VideoInfo,包名com.jeffmony.video下面,那JNI其对应是Lcom/jeffmony/video/...我们这边需要着重记住就是JavaVM一个进程只存在一个,这个很重要,JNI多线程需要这个作为基础。...JNI多线程: 我们经常遇到一个场景是,JNI可能会开启一个线程,如何回调到Java层来?

    1.9K10

    JNI线程相关

    注:Android develop编码建议是: 尽可能避免使用受管理编程语言编写代码与使用 C++ 编写代码之间进行异步通信。这样可使 JNI 接口更易于维护。...例如,最好使用 Java 编程语言线程之间进行回调(其中一个线程发出阻塞 C++ 调用,然后阻塞调用完成时通知界面线程),而不是通过 JNI 从使用 Java 代码界面线程调用 C++ 函数。...JNIEnv 与多线程 之前文章提到过JNIEnv是线程相关,即在每一个线程中都有一个JNIEnv指针,每个JNIEnv都是线程专有的,其他线程不能使用本线程JNIEnv....一种比较常见应用场景是:native 层创建了线程,线程执行完后想将结果返回给java层,这时线程是不能用jni函数参数JNIEnv,因为参数JNIEnv属于不同线程....mObject = env->NewGlobalRef(weak_thiz); } 可以看到,构造函数调用了mObject = env->NewGlobalRef(weak_thiz);创建了对

    1.4K20

    Xposed 配置,使用以及原理介绍

    本篇介绍 搞逆向时候,Hook是很必要手段,通过Hook就可以了解内部运行机制,甚至进行修改。...1.1.3 安装magisk magsik 可以看成是一个特殊文件系统,可以提供root能力同时又隐藏已被root事实,这样一些防root应用也可以设备上正常使用了,和xposed关系如下:...YAHFA:android art上一个hook框架 看到这些介绍,现在就知道我们安装那些zip,apk分别用来干啥了吧?...2 Module演示 接下来我们通过一个Demo演示下Xposed能力,比如我们需要hook下微信,让微信显示我们自己定义字符。 1.1 环境准备 首先创建一个工程,无Activity就行。...'de.robv.android.xposed:api:82:sources' 接下来新建一个实现IXposedHookLoadPackage 接口,这儿就是hook行为了,代码基本可以自解释:

    2.5K20

    NDK开发(九) :Hello jniCallback

    转载请以链接形式标明出处: 本文出自:103style博客 本文操作以 Android Studio 3.5 版本为例 本文为参考官方示例 hello-jniCallback 动手写 Demo...因为这个只需要执行一次就好了,我们可以放到JNI_OnLoad方法中去实现(应用层调用.so库首先会执行 JNI_OnLoad 方法)。 获取内部类用 而不是 ....,例如: env->FindClass("com/lxk/ndkdemo/JniCallbackDemo 这里构建了一个结构体jniCallback保存获取 和 实例。...= nullptr; return JNI_VERSION_1_6; } 创建线程执实现开始计时逻辑: 通过pthread_create创建线程时候,第一个参数:线程id指针;第二参数...:线程属性指针;第一个参数:在线程运行函数;第四参数:运行函数参数 extern "C" JNIEXPORT void JNICALL Java_com_lxk_ndkdemo_JniCallbackDemo_startTiming

    34330

    JNI编程如何巧妙获取JNIEnv

    你可能有这样想法,我们把env存到本地不就可以了吗,答案是不可以,因为每一个Java线程都会有一个对应env,我们Native层无法感知到是哪一个Java线程,保存env可能当时有效,换一个线程就会失效...JavaVM:Java虚拟机Native层代表,Android一个进程只有一个JavaVM,所有的线程共用一个JavaVM。...Native环境创建线程,如果需要调用JNI方法,必须要调用AttachCurrentThread()与JVM进行关联,使用后也需要调用DetachCurrentThread()来解除关联。...小总结: Android进程Native层,通过任何一个可用JNIEnv都可以获取到整个进程唯一JavaVM,在任何线程中都可以通过JavaVM获取当前线程可用JNIEnv,如果是Native...方法二:通过JNIEnv获取JavaVM,程序最开始写一个类似于初始化功能函数,传到Native层一个可用JNIEnv,之后就可以获取到JavaVM。

    4.7K30

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

    , 注意子线程 JNI 环境需要获取 , 主线程 JNI 环境可以直接从 Native 层实现 Java 方法获取 ; ② jobject instance : Native 层 Java...主线程 JNIEnv *env 和 jobject instance 获取方法 : 这两值都可以 C++ 实现 native 方法获取 ; extern "C" JNIEXPORT void...JavaVM *vm ---- JavaVM *vm 获取方法 : JNI_OnLoad() 方法获取 ; //JNI_OnLoad 获取 Java 虚拟机对象放在这里 JavaVM *javaVM...局部引用 与 全局引用 : JavaVM *vm , JNIEnv *env 与 jobject instance 是方法获取 , 如果跨线程调用 , 就需要考虑其引用类型 , 局部引用 或 全局引用...Native 调用 Java 方法 ( 主线程 ) ---- 主线程可以直接使用 Native 方法获取 JNIEnv *env 调用 Java 方法 ; //主线程 : 可以直接使用

    1K20

    Android NDK 开发】JNI 引用 ( 全局引用 | NewGlobalRef | DeleteGlobalRef )

    全局引用作用域 : 与局部引用对比 : 全局引用与局部引用相对应 , 其作用域是全局 , 局部引用只能在当前方法使用 ; 空间 : 可以 跨方法 , 跨线程使用 ; 时间 : 创建可以使用 , 手动释放后全局引用失效...创建全局引用 ( NewGlobalRef ) ---- 1 ....函数原型 : 传入一个局部引用参数 , 将局部引用转为全局引用 ; 返回值 : 由局部引用转换成全局引用 ; 参数 : jobject obj : 使用 NewXXX / FindXXX 等 大多数...跨方法 , 跨线程使用 时间 : 创建可以使用 , 手动释放后全局引用失效 全局引用创建 : NewGlobalRef 全局引用释放...: DeleteGlobalRef 全局引用会阻止 JVM 回收该引用 这里注意域作用符使用 , 本方法没有 class_teacher_global 同名变量

    1.2K20

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

    可能就有大兄弟立马说:nativeThreadEnvTest传入env时NewGlobalRef啊,这样就可以全局使用了!这好像确实是一个解决思路,好像还蛮好使(因为兄弟你见识得太少了)。但是!...每一个执行绪在呼叫native函数时,所传递进来JNIEnv指标值都是不同。...为了配合这种多执行绪环境,C组件开发者撰写native函数时,可藉由JNIEnv指标值之不同而避免执行绪资料冲突问题,才能确保所写native函数能安全地Android多执行绪VM里安全地执行...这里JavaVM就是虚拟机VMJNI表示,一个进程JVM只有一个JavaVM对象,这个对象是线程共享。...说到AttachCurrentThread,不能不提起JavaVM另外一个接口 GetEnv,看上去GetEnv不就是获取env方法

    2.8K41

    Android平台下使用FFmpeg进行RTMP推流(视频文件推流)简介

    简介 前面已经讲到如何在Linux环境下编译FFmpeg以及Android项目中使用,这一节就开始真正使用FFmpeg。Android平台下用FFmepg解析视频文件并进行RTMP推流。...新增推流函数 异常处理 设置回调方法 常见问题 源码 新增推流函数 首先我们将所有FFmpeg操作抽取到一个里面,然后增加推流方法。...至于FFmpeg使用,这里就不重复讲了,不懂可以看之前文章。源码见末尾 异常处理 我们之前推流代码,并没有做异常处理。这样正式使用中肯定不太好。所以我们加上try catch。...源码见末尾 设置回调方法 为了方便我们查看推流信息,我们新增一个回调类。...,可以从文件判断。

    6.5K20

    Android NDK 常见面试题

    总结: JNI 是实现目的,NDK 是 Android 实现 JNI 手段。 二、谈谈你对 JNIEnv 和 JavaVM 理解 JavaVM JavaVM 是虚拟机 JNI 层代表。...注意: native 环境下创建线程,要想和 java 通信,即需要获取一个 JNIEnv 对象。...三、解释一下 JNI 全局引用和局部引用区别和使用 全局引用 通过 NewGlobalRef 和 DeleteGlobalRef 方法创建和释放一个全局引用。...局部引用 通过 NewLocalRef 和 DeleteLocalRef 方法创建和释放一个局部引用。 局部引用只创建 native 方法中有效,包括其调用其它函数中有效。...五、怎么定位 NDK 问题和错误 一般开发阶段的话,我们可以通过 log 来定位和分析问题。

    1.1K40

    C++11 JNI开发RAII应用(二)--JNI函数封装

    在上一节《C++11 JNI开发RAII应用(一)》我们已经有了一些基本RAII封装工具,本节就简单了,就是根据需要把一些常用JNIEnv函数封装成更方便使用模板函数。...raii_NewGlobalRef raii_NewGlobalRef函数顾名思义,就是封装JNIEnv::NewGlobalRef,将一个本地引用jobject转为全局引用封装在raii_var。...,则返回raii_var类型默认为jobject,否则 下面所有的模板函数都是这个用法。...jclass对象 raii_GetObjectClass raii_GetObjectClass封装JNIEnv::GetObjectClass,返回一个jobjectjclass对象 static...UTF-8编码字符串转为java String(jstring) raii_NewStringUTF封装JNIEnv::NewString,将一个Unicode 编码jchar数组转为java

    66340

    Android JNI 引用管理

    Native 代码中有时候会接收 Java 传入引用类型参数,有时候也会通过 NewObject 方法来创建一个 Java 引用类型变量。...如果把 FindClass 函数创建局部引用也通过 static 变量缓存起来,那么函数退出后,局部引用被自动释放了,static 静态变量存储就是一个被释放后内存地址,成为了一个野指针,再次调用时就会引起程序崩溃了...比如,通过局部引用创建一个大对象,然后这个对象函数中间就完成了任务,那么就可以早早地通过手动释放了,而不是等到函数结尾才释放。...它们可以为局部引用创建一个指定数量内嵌空间,在这个函数对之间局部引用都会在这个空间内,直到释放后,所有的局部引用都会被释放掉,不用再担心每一个局部引用释放问题了。...同时,对于工具 Native 函数,使用缓存技术来保存一些全局引用也是能够提高效率,正如 Android JNI 调用时缓存字段和方法 ID 文章写到一样。

    1.4K10
    领券