返回

JNI引领Android NDK开发之旅:探究引用机制

Android

JNI在Android NDK中的引用机制:探究局部引用和全局引用

在Android NDK开发中,JNI(Java Native Interface)作为连接Java和C/C++代码的桥梁,允许开发者在原生代码中访问Java对象。JNI引用机制是实现这种连接的关键,它决定了Java对象在原生代码中的生命周期。

JNI引用概念:引用变量

JNI中的引用机制是以引用变量(pointer)的形式实现的。这些引用变量指向Java对象在Java虚拟机(JVM)中的内存地址。当一个JNI引用变量指向一个Java对象时,该对象便不会被JVM垃圾回收。

引用类型:局部引用和全局引用

JNI引用分为两种主要类型:局部引用和全局引用。

局部引用

局部引用是指只能在创建它们的函数或代码块内使用的引用变量。当函数或代码块执行完毕时,局部引用将被自动释放,指向的Java对象可以被JVM垃圾回收。

全局引用

全局引用是指可以在整个JVM生命周期内使用的引用变量。它们由NewGlobalRef()函数创建,并由DeleteGlobalRef()函数释放。全局引用不会自动释放,因此开发者需要在不再需要时手动释放它们。

作用:告知虚拟机何时回收JNI变量

JNI引用机制的主要作用是告知JVM何时回收JNI变量。当JNI引用变量指向的Java对象不再被需要时,开发者应释放引用变量,以便JVM可以回收对象。这对于防止内存泄漏至关重要。

局部引用

局部引用由NewLocalRef()函数创建,并由DeleteLocalRef()函数释放。它们通常在短时间的操作中使用,例如在函数调用中传递Java对象。由于局部引用在函数或代码块执行完毕后自动释放,因此开发者无需手动释放它们。

全局引用

全局引用由NewGlobalRef()函数创建,并由DeleteGlobalRef()函数释放。它们通常在长时间的操作中使用,例如在C++类中存储Java对象。由于全局引用不会自动释放,因此开发者需要在不再需要时手动释放它们。

全局弱引用

全局弱引用是全局引用的一个特殊类型,由NewWeakGlobalRef()函数创建,并由DeleteWeakGlobalRef()函数释放。全局弱引用与普通全局引用的区别在于,它们不会阻止Java对象被垃圾回收。当Java对象被垃圾回收时,全局弱引用将被自动释放。

总结

JNI引用机制是Android NDK中连接Java和C/C++代码的关键。通过理解局部引用和全局引用的概念和作用,开发者可以有效地管理JNI变量的生命周期,防止内存泄漏,并确保JNI代码的稳定运行。