我正在尝试在Android NDK中编写一些c代码,从java应用程序中获取一些数组变量,进行一些数学分析并将结果返回给java。我现在的代码返回正确的数据,但每次调用函数时都会在logcat上产生警告:
JNI: pincount on array 0x423d0de0 ([F) is now x
pincount一直在上升,直到程序最终崩溃。
据我所知," pin"是在调用GetFloatArrayElements时创建的,并且在调用ReleaseFloatArrayElements时应该删除它,但显然我在某处出错了。这是我的代码:
JNIEXPORT jfloat JNICALL
Java_net_zx82_rendertest_testHist(JNIEnv * env, jobject obj, jfloatArray dataArray, jfloatArray gainArray, jfloatArray offsetArray)
{
//get data
jfloat *a = (*env)->GetFloatArrayElements(env, dataArray, 0);
jfloat *b = (*env)->GetFloatArrayElements(env, gainArray, 0);
jfloat *c = (*env)->GetFloatArrayElements(env, offsetArray, 0);
return a[100]*b[100]+c[100]; //do some sums
//release the data
(*env)->ReleaseFloatArrayElements(env, dataArray, a, 0);
(*env)->ReleaseFloatArrayElements(env, gainArray, b, 0);
(*env)->ReleaseFloatArrayElements(env, offsetArray, c, 0);
}
答案 0 :(得分:4)
在编写的代码中,当达到return
时,方法的执行将停止,并且ReleaseFloatArrayElements
调用将永远不会执行。
计算结果,将其存储在临时文件中,并在方法的最后返回。
在C ++中,您可以创建辅助类,以便在数组元素超出范围时自动释放它们。例如,参见" scoped primitive array" Android源代码中的类。