`

Android JNI 引用讨论

阅读更多

原文参见:http://my.unix-center.net/~Simon_fu/?p=856

 

原文总结如下:

  1. 局部引用是Native代码中最常用的引用。大部分局部引用都是通过JNI API返回来创建,也可以通过调用NewLocalRef来创建。另外强烈建议Native函数返回值为局部引用。局部引用只在当前调用上下文中有效,所以局部引用不能用Native代码中的静态变量和全局变量来保存。另外时刻要记着Java虚拟机局部引用的个数是有限的,编程的时候强烈建议调用EnsureLocalCapacity和PushLocalFrame来确保Native代码能够获得足够的局部引用数量。
  2. 全局变量必须要通过NewGlobalRef创建,通过DeleteGlobalRef删除。主要用来缓存Field ID和Method ID。全局引用可以在多线程之间共享其指向的对象。在C语言中以静态变量和全局变量来保存。
  3. 全局引用和局部引用可以阻止Java虚拟机回收其指向的对象。
  4. 弱全局引用必须要通过NewWeakGlobalRef创建,通过DeleteWeakGlobalRef销毁。可以在多线程之间共享其指向的对象。在C语言中通过静态变量和全局变量来保持弱全局引用。弱全局引用指向的对象随时都可能会被Java虚拟机回收,所以使用的时候需要时刻注意检查其有效性。弱全局引用经常用来缓存jclass对象。
  5. 全局引用和弱全局引用可以在多线程中共享其指向对象,但是在多线程编程中需要注意多线程同步。强烈建议在JNI_OnLoad初始化全局引用和弱全局引用,然后在多线程中进行读全局引用和弱全局引用,这样不需要对全局引用和弱全局引用同步(只有读操作不会出现不一致情况)。

 

分享到:
评论

相关推荐

    android jni抛出异常

    这里,`exceptionClass`是你想要抛出的异常类的JNI引用,`exceptionConstructor`是该类的构造函数ID,`errorMessage`是异常的详细信息。你需要先通过`FindClass()`找到对应的Java异常类,然后获取其构造函数的ID,再...

    基于Android系统的高效JNI

    接着,我们讨论如何优化JNI的性能。一种常见方法是减少Java和本地代码之间的上下文切换。例如,可以通过批量处理任务或者预加载数据来减少调用次数。另外,合理使用局部引用表和全局引用可以避免Java对象过早垃圾...

    基于Android的android_jni操作指南.zip

    然而,由于现代Android开发更倾向于使用Android Studio和IntelliJ IDEA,因此这里将主要围绕这两个IDE展开讨论。 **一、JNI基础知识** 1. **JNI接口定义**:JNI接口定义了Java与本地代码之间的桥梁,包括Java类、...

    Android的jni的应用C,C++(基本类型,数组,类(结构体)).源码

    接下来,我们讨论JNI中的数组处理。在JNI中,可以使用`NewObjectArray()`创建一个Java对象数组,`GetObjectArrayElement()`和`SetObjectArrayElement()`用于访问和修改数组元素。对于基本类型的数组,如整数数组,...

    JNI-study(讲JNI的书,中文版)

    4. 跨语言通信:阐述JNI如何在Java和本地代码之间传递参数,以及如何处理返回值,包括引用传递和值传递的区别。 5. 异常处理:介绍在JNI中如何捕获和抛出Java异常,以及如何在本地代码中进行错误处理。 6. 类和...

    jni教程实例手把手

    3. **Java_JNI_编程进阶.pdf**:这本书可能深入讨论了JNI的高级主题,例如动态链接库的加载、内存管理、字符串处理、对象引用等。对于想要提升JNI编程技能的人来说,这将是一个宝贵的资源。 4. **Android开发教程之...

    Android Java代码与JNI交互 JNI访问Java构造方法(九).zip

    本资料重点讨论的是如何通过JNI调用Java对象的构造方法。 JNI在Android开发中的应用广泛,比如优化性能、访问硬件接口、使用第三方库等。它允许我们定义C/C++函数,然后在Java层通过`native`关键字调用这些函数。在...

    JNI最佳实践

    ### JNI最佳实践 ...通过上述讨论可以看出,正确处理性能和正确性缺陷对于开发高质量的JNI代码至关重要。希望本文提供的解决方案能够帮助开发者们更好地利用JNI这一强大工具,同时避免常见的陷阱和误区。

    jni、ndk绝命讲解

    8. **跨平台兼容性**:讨论如何确保在不同Android设备上编译的原生代码具有良好的兼容性。 9. **性能优化**:提供使用NDK和JNI进行性能优化的策略和最佳实践。 10. **案例研究**:通过实例演示如何结合JNI和NDK...

    jni测试封装aar图像处理demo

    4. **集成到Android项目**:将.so文件和对应的Java代码打包到aar库中,以便在Android Studio项目中引用。 5. **调用aar库**:在Android应用中,通过Java代码调用aar库中的JNI方法,处理图像。 6. **测试与优化**:...

    传智播客_Andorid_JNI视频_day03视频

    7. 回调机制:解释如何从C/C++代码回调Java方法,这通常涉及到JNI的全球引用(Global References)和弱全局引用(Weak Global References)的管理。 8. 异常处理:在JNI中,Java的异常不能直接抛出到C++层面,所以...

    HFPclient JNI层

    当涉及到HFPclient的JNI层时,我们实际上是在讨论如何在Java应用程序中通过JNI调用C或C++编写的原生代码来处理HFP协议。 JNI层的构建主要是为了性能优化和访问硬件资源。由于Java虚拟机的运行机制,对于一些底层...

    【计算机专业-Andorid项目源码100套之】JNI编程指南

    3. **数据类型转换**:JNI中Java与C/C++的数据类型并不完全对应,文档可能会详细解释如何在两者之间进行数据类型转换,例如基本类型、对象引用、数组等。 4. **JNI函数调用**:讲解如何从Java代码调用C/C++函数,...

    Android应用源码之java调用C例子.zip

    这样的技术被称为JNI(Java Native Interface),它是Android系统提供的一种机制,允许Java代码和其他语言编写的代码进行交互。本压缩包包含了一个关于如何在Android应用中使用JNI调用C代码的例子。 `logo.png`可能...

    Android C++高级编程 使用NDK

    2. **JNI(Java Native Interface)**:讲解JNI的基础知识,如何在Java代码中调用C++函数,以及在C++中调用Java方法,这是Android应用与原生代码交互的关键。 3. **C++11及更高版本支持**:NDK支持C++11及以上版本...

    深入理解Android:卷I--详细书签版

     本书是在分析Android源码的基础上展开的,而源码文件所在的路径一般都很长,例如,文件AndroidRuntime.cpp的真实路径就是framework/base/core/jni/AndroidRuntime.cpp。为了书 写方便起见,我们在各章节开头把该...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    android上ffmpeg三个开源项目源码

    - JNI(Java Native Interface):连接 Java 和 C/C++ 代码的桥梁,使得 Android 应用可以调用 FFmpeg 函数。 - 配置与编译:根据项目需求,定制 FFmpeg 配置,如选择特定的编解码器,然后使用 NDK 工具链进行编译...

Global site tag (gtag.js) - Google Analytics