我想知道是否可以从C ++中释放返回值。我在C ++中使用NDK来构建一个Android本机库。
我想做这样的事情:
在我的C ++代码中:
JNI入口点
BaseScalarField(CoordSystem(Symbol('egg_carton'), Patch(Symbol('P'), Manifold(Symbol('M'), Integer(2))), Tuple(Symbol('u'), Symbol('v'))), Integer(0))
Differential(BaseScalarField(CoordSystem(Symbol('egg_carton'), Patch(Symbol('P'), Manifold(Symbol('M'), Integer(2))), Tuple(Symbol('u'), Symbol('v'))), Integer(0)))
一个异步调用的方法来释放返回值
JNIEXPORT jbyteArray JNICALL Java_myMethod(JNIEnv * env, jobject obj){
int len = 16;
char* buf = (char*) malloc(len);
jbyteArray array = env->NewByteArray (len);
env->SetByteArrayRegion (array, 0, len, reinterpret_cast<jbyte*>(buf));
std::thread{&MyClass::asynchronousFree, this, array}.detach();
return array;
}
在我的Android代码中:
void Myclass::asynchronousFree(jbytearray array){
//code to free the memory after a specified time
}
感谢您的帮助。
答案 0 :(得分:0)
从C ++执行此操作与从Java执行此操作没有什么不同。这意味着,给定对数组或任何其他Java对象的引用,您不能强制此对象不存在,但您可以更改其属性。
对于数组,它的长度是不可变的,但元素不是。您的asynchronousFree()
方法可以将所有元素设置为0,或以其他方式指示数组不再有效。
为了更好地控制这种情况,你可以使用你喜欢的任何Java容器,包括最接近数组的ArrayList或者ByteBuffer。
所有这些对象都支持这个或那个clear(),reset()或resize(0)方法,它基本上会释放元素。与Java一样,其他一些代码仍然可以保留对任何元素的引用。更糟糕的是,对于您提出的任何数据结构,始终有一种方法可以执行“深层复制”并保留您想要销毁的值。