JNI中的对象
即便是写在C代码里面, 也可以在JNI中创建对象, 只是没有对对象操作的方法.
JNI中的对象默认最多创建16个, 如果使用EnsureLocalCapacity可以通过参数传递想创建对象的个数, 根据返回值确认是否可以创建.
JNI对象的销毁
默认最多16个对象, 所以如果超过16个, 就需要销毁, JNI提供了2种对象的销毁,
1. 局部对象, 定义在方法中的对象
2. 全局对象
需要销毁的对象
如果全局对象和局部对象可能超过16个就要及时销毁
全局对象比较多, 局部对象名额不足, 这个时候如果不用就需要及时销毁, 如果使用EnsureLocalCapacity扩充了能创建对象可创建的数量除外.
不需要销毁的对象
每次在函数返回后局部对象都会自动销毁, 可以不手动销毁
销毁局部对象: DeleteLocalRef
销毁全局对象: DeleteGlobalRef
销毁代码块创建的所有对象
通过PushLocalFrame方法开启代码块, 通过PopLocalFrame方法结束代码块, 这之间创建的对象都会被销毁. 除了PopLocalFrame的第二个参数的对象会在下一个代码块中重新创建并返回, 这个代码块中所有创建的对象都会被销毁
返回不被销毁的对象的用法
retStr = (*env)->PopLocalFrame(env, retStr);
该代码块所有对象都会被销毁的用法
(*env)->PopLocalFrame(env, NULL);
创建全局对象
很多时候全局对象是必须的, 可以在JNI的初始化方法JNI_OnLoad中就创建
dpClass = (*env)->NewGlobalRef(env, pClass);
根据局部对象pClass创建全局对象dpClass, 在程序结束后所有对象都会销毁, 内存会被释放. 也可以在JNI_OnUnload方法中释放
(*env)->DeleteGlobalRef(env, dpClass);