一般来说,知道应该保留对所有 Bridj 指针的 java 引用就足够了,这样它们就不会被 JVM 垃圾收集器收集。一旦发生,Bridj/JNI 将释放为这些指针分配的内存。
需要注意的一种特殊情况是:假设您创建了一个自动生成(使用 JNAerator)类的 Java 实例:
@Library("libtarget.so")
public class SomeStruct extends StructObject {
public SomeStruct() {
super();
}
@Field(0)
public Pointer<Byte > p0() {
return this.io.getPointerField(this, 0);
}
@Field(0)
public SomeStruct p0(Pointer<Byte > p0) {
this.io.setPointerField(this, 0, p0);
return this;
}
...
}
接着
val struct = new SomeStruct()
struct.p0(pointerToCString("a"))
仅保留对 struct 对象的引用是不够的,还应单独维护对 pointerToCString("a") 的引用。如果没有,Bridj/JNI 将在垃圾收集器收集此指针后释放分配的内存。上面的代码并不明显,因为它表明 SomeStruct() 对象无论如何都应该保留对 pointerToCString("a") 指针的引用。