可以从C ++释放分配的内存输出

时间:2015-11-05 13:36:38

标签: android c++ memory asynchronous android-ndk

我想知道是否可以从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
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

从C ++执行此操作与从Java执行此操作没有什么不同。这意味着,给定对数组或任何其他Java对象的引用,您不能强制此对象不存在,但您可以更改其属性。

对于数组,它的长度是不可变的,但元素不是。您的asynchronousFree()方法可以将所有元素设置为0,或以其他方式指示数组不再有效。

为了更好地控制这种情况,你可以使用你喜欢的任何Java容器,包括最接近数组的ArrayList或者ByteBuffer。

所有这些对象都支持这个或那个clear(),reset()或resize(0)方法,它基本上会释放元素。与Java一样,其他一些代码仍然可以保留对任何元素的引用。更糟糕的是,对于您提出的任何数据结构,始终有一种方法可以执行“深层复制”并保留您想要销毁的值。