直接看这里https://zhuanlan.zhihu.com/p/268822452
简介
NativeAllocationRegistry 是 Android 平台中的一个类,它用于管理在 Java 和 Native 代码间的内存分配。
当java对象被回收后, 通过某种机制回调之前注册的native层的内存回收函数. 这里说的机制具体是指引用队列.
它通过注册内存分配方法和内存释放方法,来管理在 Java 和 Native 代码间的内存分配和释放。这样,Java 应用程序可以通过调用 NativeAllocationRegistry 的方法分配内存,而在不再使用该内存时,NativeAllocationRegistry 将自动释放这些内存。
这样,使用 NativeAllocationRegistry 可以帮助开发人员避免内存泄漏和其他内存问题,同时也提高了代码的可读性和可维护性。
因此,如果你在开发 Android 平台的 Native 应用程序,并需要在 Java 和 Native 代码间分配内存,那么你可以考虑使用 NativeAllocationRegistry 来管理内存分配和释放。
原理
NativeAllocationRegistry 的实现原理基于 Java 和 Native 代码间的内存分配。
在 Java 代码中,NativeAllocationRegistry 定义了一组内存分配方法和内存释放方法。当 Java 代码需要分配内存时,它会调用 NativeAllocationRegistry 的内存分配方法,进而分配内存。
在 Native 代码中,NativeAllocationRegistry 会调用相应的内存释放方法,释放分配的内存。
通过这种方式,NativeAllocationRegistry 可以管理 Java 和 Native 代码间的内存分配和释放,避免内存泄漏和其他内存问题,同时也提高了代码的可读性和可维护性。
因此,NativeAllocationRegistry 的实现原理是通过定义内存分配方法和内存释放方法,管理 Java 和 Native 代码间的内存分配和释放。
使用
- 创建 NativeAllocationRegistry 实例:
NativeAllocationRegistry registry = new NativeAllocationRegistry(
ClassLoader.getSystemClassLoader(),
new NativeAllocationRegistry.Sizes(
sizeOfNativeObject,
sizeOfNativeContext,
sizeOfNativeAllocation),
numberOfNativeAllocations);
- 定义内存分配方法:
long allocateNative(int size) {
return registry.newNonNativeAllocation(size, 0);
}
- 定义内存释放方法:
void freeNative(long address) {
registry.free(address);
}
- 在 Java 代码中调用内存分配方法:
long nativeAddress = allocateNative(size);
- 在 Native 代码中调用内存释放方法:
freeNative(nativeAddress);