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的引用的更多相关文章

  1. NDK学习笔记-JNI多线程

    前面讲到记录到ffmpeg音视频解码的时候,采用的是在主线程中进行操作,这样是不行的,在学习了POSIX多线程操作以后,就可以实现其在子线程中解码了,也可以实现音视频同步了 简单示例 在native实 ...

  2. NDK学习笔记-JNI数据类型和属性方法的访问

    JNI实现了C/C++与Java的相互访问,那么这篇文章就从C/C++访问Java开始说起 native函数说明 每个native函数,都至少有两个参数(JNIEnv *和jclass或jobject ...

  3. NDK学习笔记-JNI的异常处理与缓存策略

    在使用JNI的时候,可能会产生异常,此时就需要对异常进行处理 异常处理 JNI抛出Throwable异常,在Java层可以用Throwable捕捉 而在C只有清空异常这种处理 但如果在JNI中通过Th ...

  4. NDK学习笔记-JNI开发流程

    JNI(Java Native Interface)Java本地化接口,Java调用C/C++,C/C++调用Java的一套API接口 实现步骤 在Java源文件中编写native方法 public ...

  5. ndk学习20: jni之OnLoad动态注册函数

    一.原理 当在系统中调用System.loadLibrary函数时,该函数会找到对应的动态库, 然后首先试图找到"JNI_OnLoad"函数,如果该函数存在,则调用它 JNI_On ...

  6. Dubbo -- 系统学习 笔记 -- 示例 -- 泛化引用

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 泛化引用 泛接口调用方式主要用于客户端没有API接口及模型类元的情况,参数及返回值 ...

  7. android学习笔记----JNI中的c控制java

    面向对象的底层实现 java作为面向对象高级语言,可对现实世界进行建模.和面向过程不同的是面向对象软件的编写不是流程的堆积,而是对业务逻辑的多视角分解和分类.其过程大致为:      1).将知识分解 ...

  8. Android JNI和NDK学习(06)--JNI的数据类型(转)

    本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3094037.html 本文介绍JNI的数据类型.NDK中关于JNI数据类型的 ...

  9. ndk学习17: jni之Java调用C&C++

    一.Hello World 1. 定义函数原型 native关键字定义的函数即为jni函数 2.生成头文件 切换到src目录执行: (这个过程可以写脚本自动完成,比如自动拷贝到jni目录) javah ...

随机推荐

  1. 最后执行finally

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. map填充bean赋值,包括父类全部填充。

    有不少工具类给bean填充值.但是填充,很多都是只能填充到当前类的对象.经过需求修改,做了个工具类: import java.lang.reflect.Field; import java.lang. ...

  3. 21、自动装配-@Resource&@Inject

    21.自动装配-@Resource&@Inject Spring 还支持使用@Resource(JSR250)和@Inject(JSR330)[Java规范的注解] AutowiredAnno ...

  4. vue中把props中的值赋值给data

    vue中把props中的值赋值给data 2018年12月26日 14:37:11 木豆mudou 阅读数 3497   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上 ...

  5. Security Study

    1.WebGoat http://www.owasp.org.cn/ 学习Web应用漏洞最好的教程----WebGoat http://blog.csdn.net/bill_lee_sh_cn/art ...

  6. c++ demo code

    /* //多继承 #include <iostream> using namespace std; class Sofa { public: Sofa(); ~Sofa(); void s ...

  7. Hadoop环境搭建|第四篇:hive环境搭建

    一.环境搭建 注意:hive版本不能太高,否则会出现兼容性问题 1.1.上传hive安装包 创建文件夹用于存放hive文件命令:mkdir hive 1.2.解压hive安装包 命令:tar -zxv ...

  8. java课后实验性问题2

    课后作业一:计算组合数 程序设计思想: 从键盘获取组合数,判断是否构成组合数.分别用三种方法计算组合数输出. 程序流程图: import java.util.Scanner; public class ...

  9. delphi nethttpclient操作cookie

    delphi nethttpclient操作cookie unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysU ...

  10. DELPHI10.3.1安卓照相

    DELPHI10.3.1安卓照相 解决方法: