NDK学习笔记-JNI的引用
JNI中的引用意在告知虚拟机何时回收一个JNI变量
JNI引用变量分为局部引用和全局引用
局部引用
局部引用,通过DeletLocalRef手动释放对象
原因
- 访问一个很大的Java对象,使用之后还用进行复杂的耗时操作
- 创建了大量的局部引用,占用了太多的内存,而且这些局部引用跟后面的操作没有关联性
局部引用示例
Java中存在native方法
public native void localRef();
在native中有调用对象,但对象在使用以后就不再使用,此时就可以将对象释放掉,以节约内存
此处举一个循环创建数组的,数组中建立对象的例子
JNIEXPORT void JNICALL Java_com_cj5785_jni_JniTest_localRef
(JNIEnv *env, jobject jobj)
{
int i = 0;
for (;i < 10; i++)
{
//创建Date对象
jclass cls = (*env)->FindClass(env, "java/util/Date");
jmethodID constructor_mid = (*env)->GetMethodID(env, cls, "<init>", "()V");
jobject obj = (*env)->NewObject(env, cls, constructor_mid);
//使用完毕,通知垃圾回收器回收对象
(*env)->DeleteLocalRef(env, obj);
printf("已通知垃圾回收器回收对象\n");
}
}
全局引用
共享(可以跨多个线程),手动控制内存使用
此处通过创建一个字符串来说明,native中存在一个全局变量jstring global_str;
创建
Java
public native void createGlobalRef();
C
JNIEXPORT void JNICALL Java_com_cj5785_jni_JniTest_createGlobalRef
(JNIEnv *env, jobject jobj)
{
jstring lobj = (*env)->NewStringUTF(env, "jni golbal test");
global_str = (*env)->NewGlobalRef(env, lobj);
}
获取
Java
public native String getGlobalRef();
C
JNIEXPORT jstring JNICALL Java_com_cj5785_jni_JniTest_getGlobalRef
(JNIEnv *env, jobject jobj)
{
return global_str;
}
释放
Java
public native void deleteGlobalRef();
C
JNIEXPORT void JNICALL Java_com_cj5785_jni_JniTest_deleteGlobalRef
(JNIEnv *env, jobject jobj)
{
(*env)->DeleteGlobalRef(env, global_str);
}
弱全局引用
节省内存,在内存不足时,可以释放所引用的对象
可以引用一个不常用的对象,如果为NULL
,临时创建
创建:NewWeakGlobalRef
销毁:DeleteGlobalWeakRef
NDK学习笔记-JNI的引用的更多相关文章
- NDK学习笔记-JNI多线程
前面讲到记录到ffmpeg音视频解码的时候,采用的是在主线程中进行操作,这样是不行的,在学习了POSIX多线程操作以后,就可以实现其在子线程中解码了,也可以实现音视频同步了 简单示例 在native实 ...
- NDK学习笔记-JNI数据类型和属性方法的访问
JNI实现了C/C++与Java的相互访问,那么这篇文章就从C/C++访问Java开始说起 native函数说明 每个native函数,都至少有两个参数(JNIEnv *和jclass或jobject ...
- NDK学习笔记-JNI的异常处理与缓存策略
在使用JNI的时候,可能会产生异常,此时就需要对异常进行处理 异常处理 JNI抛出Throwable异常,在Java层可以用Throwable捕捉 而在C只有清空异常这种处理 但如果在JNI中通过Th ...
- NDK学习笔记-JNI开发流程
JNI(Java Native Interface)Java本地化接口,Java调用C/C++,C/C++调用Java的一套API接口 实现步骤 在Java源文件中编写native方法 public ...
- ndk学习20: jni之OnLoad动态注册函数
一.原理 当在系统中调用System.loadLibrary函数时,该函数会找到对应的动态库, 然后首先试图找到"JNI_OnLoad"函数,如果该函数存在,则调用它 JNI_On ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 泛化引用
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 泛化引用 泛接口调用方式主要用于客户端没有API接口及模型类元的情况,参数及返回值 ...
- android学习笔记----JNI中的c控制java
面向对象的底层实现 java作为面向对象高级语言,可对现实世界进行建模.和面向过程不同的是面向对象软件的编写不是流程的堆积,而是对业务逻辑的多视角分解和分类.其过程大致为: 1).将知识分解 ...
- Android JNI和NDK学习(06)--JNI的数据类型(转)
本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3094037.html 本文介绍JNI的数据类型.NDK中关于JNI数据类型的 ...
- ndk学习17: jni之Java调用C&C++
一.Hello World 1. 定义函数原型 native关键字定义的函数即为jni函数 2.生成头文件 切换到src目录执行: (这个过程可以写脚本自动完成,比如自动拷贝到jni目录) javah ...
随机推荐
- 前端面试题-HTML+CSS
引用GitHub 上 ltadpoles的前端面试 https://github.com/ltadpoles HTML部分 1. Doctype作用,HTML5 为什么只需要写<!DOCTYPE ...
- IMEI手机串码和serialno
IMEI 1.IMEI是什么 国际移动设备识别码(International Mobile Equipment Identity number,IMEI),俗称“手机串号”.“手机串码”.“手机序列号 ...
- SVG矢量绘图 path路径详解(贝塞尔曲线及平滑)
以二次贝塞尔曲线的公式为例: js函数: //p0.p1.p2三个点,其中p0为起点,p2为终点,p1为控制点 //它们的坐标用数组表示[x,y] //t的范围是0-1 function qBerzi ...
- BZOJ 2127 / Luogu P1646 [国家集训队]happiness (最小割)
题面 BZOJ传送门 Luogu传送门 分析 这道题又出现了二元关系,于是我们只需要解方程确定怎么连边就行了 假设跟SSS分在一块是选文科,跟TTT分在一块是选理科,先加上所有的收益,再来考虑如何让需 ...
- 13、生命周期-InitializingBean和DisposableBean
13.生命周期-InitializingBean和DisposableBean InitializingBean接口 package org.springframework.beans.factory ...
- SVN错误之“copy admin area is missing”
1.将对应冲突的文件夹备份一份 2.再复制一份到别的地方,资源管理器搜索.svn全部删除掉 3.删掉本地svn目录里的冲突文件,update一下父目录,显示ok 4.把刚才删掉.svn的目录复制覆盖过 ...
- IDEA jetbrain Live Template
IDEA(jetbrain通用)优雅级使用教程 IDEA 强大的 Live Templates(转) 官网
- P4136 谁能赢呢? 脑子
思路:脑子(教练说是博弈论?) 提交:1次 题解: 结论:若\(n\)为奇数后手胜,若\(n\)为偶数先手胜. 大致证明: 我们发现,若我们把棋盘黑白染色并设左上角为黑色,那么显然有:若\(n\)为奇 ...
- 【题解】间隔排列-C++
题目Description小Q是班长.在校运动会上,小Q班要进行队列表演.小Q要选出2*N名同学编队,每人都被编上一个号,每一个从1到N的自然数都被某2名同学佩戴,现在要求将他们排成一列,使两个编号为 ...
- python 赋值魔法
序列解包: >>> x,y,z = 1, 2, 3>>> print(x, y, z)1 2 3 >>> a,b, *reset = [1,2,3 ...