【发布时间】:2016-02-06 08:55:21
【问题描述】:
我想知道是否可以从 C++ 中释放返回值。我在 C++ 中使用 NDK 来构建一个 android 本机库。
我想做这样的事情:
在我的 C++ 代码中:
JNI 入口点
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;
}
还有一个异步调用的方法来释放返回值
void Myclass::asynchronousFree(jbytearray array){
//code to free the memory after a specified time
}
在我的 Android 代码中:
void process(){
byte[] array = ndk.myMethod();
//do some stuff with the array
//here i need array erased from memory
}
感谢您的帮助。
【问题讨论】:
-
你是说释放
buf吗?如果是这样,您可以在SetByteArrayRegion之后立即执行此操作,因为SetByteArrayRegion将复制数据。 -
感谢您的回复。我不是在谈论释放 buf。我说的是释放 java 数组变量,它是 C++ jbytearray 数组变量的 JNI 代理。我想释放 Java 数组变量。
-
好吧,
NewByteArray创建了一个对 Javabyte[]的本地引用。当当前线程与 VM 分离或本机代码返回 Java 代码时,该本地引用将自动删除 IIRC。此时,如果没有其他人持有对 Java 对象的引用,则该对象将成为垃圾回收的候选对象。就像 Alex Cohn 所说的那样,您可以在数组被收集之前用垃圾覆盖它,但是您需要一种知道何时使用数组完成process的方法。 -
我可以假设我不想在 100 毫秒等一段时间后删除数组。在我的上下文中,我假设如果该过程未在这段时间内完成,则它是一种攻击。我真的需要这个敏感变量在内存中存在一段时间
标签: android c++ memory asynchronous android-ndk