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. 处理 read_csv 报错 OSError:Initializing from file failed

    1.问题发现 df=pd.read_csv("X-go报表_交易20191118.csv") print(df.info()) File "pandas/_libs/pa ...

  2. python的logging日志模块(二)

    晚上比较懒,直接搬砖了. 1.简单的将日志打印到屏幕   import logging logging.debug('This is debug message') logging.info('Thi ...

  3. C#读取App.config/Web.config

    读取需要添加 System.Configuration 引用, 两种方式添加: 1:.NETFramework程序可以在引用右击添加引用,然后添加System.Configuration 2:引入Nu ...

  4. the schema version of 'microsoft.aspnet.mvc' is incompatible with version of nuget

    Nuget versioning issue with package restore http://stackoverflow.com/questions/12035976/nuget-versio ...

  5. Gradle 发布 Jar 到 Archiva 时提示不能 Overwriting released artifacts is not allowed

    系统提示错误信息: Received status code 409 from server: Overwriting released artifacts is not allowed. 这是在 A ...

  6. 「CF716D」Complete The Graph「最短路」

    题意 给定一个\(n\)个点\(m\)条边的无向图,有一些边权暂时为\(0\),你需要分配一个\([1, 10^{18}]\)的数.最终使得\(s\)到\(t\)最短路为\(L\),输出一个可行的分配 ...

  7. 【概率论】4-5:均值和中值(The Mean and the Median)

    title: [概率论]4-5:均值和中值(The Mean and the Median) categories: - Mathematic - Probability keywords: - Me ...

  8. windows游戏编程X86 (内存)寄存器相关的基本概念

    本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22446971 作者:jadeshu   邮箱: jades ...

  9. 1558:聚会 ybt

    1558:聚会 ybt 题解(看似很难,其实要是摸清了实质这就是个大水题) 上题目 1558:聚会 时间限制: 1000 ms         内存限制: 524288 KB提交数: 82     通 ...

  10. Mongodb java.util.NoSuchElementException:null 已解决

    public static String find(){ String a=""; try{ MongoCollection<Document> collection ...