如何解决如何正确地从JNI释放内存?
在Java中,我称矩阵乘法(用于计算方矩阵的幂):
// Java
public class Matrix {
// ...
native void power(double[] a,double[] b,int rows,int cols,int exponent);
// ...
}
在C ++中,这是通过以下方式实现的:
JNIEXPORT void JNICALL power(JNIEnv* env,jobject o,jdoubleArray vals,jdoubleArray originalMatrix,jint aRows,jint aCols,jint i) {
jboolean isCopy;
// Get input array and result array to write values to.
jdouble* pa = env->GetDoubleArrayElements(vals,&isCopy);
jdouble* po = env->GetDoubleArrayElements(originalMatrix,&isCopy);
// Keeping the result of the k-th multiplication.
jdouble* tmp = new double[aRows * aCols];
for (int k = 1; k < i; k++) {
multiply(po,pa,tmp,aRows,aCols,aCols); // implemented elsewhere (but should be ok)
memcpy(tmp,aCols * aRows);
}
env->ReleaseDoubleArrayElements(vals,0); // <- THIS OK?
env->ReleaseDoubleArrayElements(originalMatrix,po,0);
delete[] tmp;
}
解决方法
似乎正确。对于输入数组,您可以在0
调用中将JNI_ABORT
替换为ReleaseDoubleArrayElements
,以确保在GetDoubleArrayElements
给您副本的情况下不会进行回写。>
对于输出数组,您还可以考虑使用输入数组的isCopy
结果来确定是否使用SetDoubleArrayRegion
而不是GetDoubleArrayElements
/ ReleaseDoubleArrayElements
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。