在Android NDK中释放<primitive type =“”>数组元素会导致“JNI:引脚数”警告</primative>

时间:2014-09-21 23:36:58

标签: java android-ndk java-native-interface

我正在尝试在Android NDK中编写一些c代码,从java应用程序中获取一些数组变量,进行一些数学分析并将结果返回给java。我现在的代码返回正确的数据,但每次调用函数时都会在logcat上产生警告:

JNI: pincount on array 0x423d0de0 ([F) is now x

pincount一直在上升,直到程序最终崩溃。

据我所知,&#34; pin&#34;是在调用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);
}

1 个答案:

答案 0 :(得分:4)

在编写的代码中,当达到return时,方法的执行将停止,并且ReleaseFloatArrayElements调用将永远不会执行。

计算结果,将其存储在临时文件中,并在方法的最后返回。

在C ++中,您可以创建辅助类,以便在数组元素超出范围时自动释放它们。例如,参见&#34; scoped primitive array&#34; Android源代码中的类。