写入jfloat数组时“致命信号11(SIGSEGV)在0x00000010(代码= 1)”

时间:2012-09-27 11:08:52

标签: java android arrays android-ndk

我目前正在用ndk实现一个android函数。 我在java中声明了函数

public static native void calculate(float[] rgb,float factor);

然后,我写了C函数:

JNIEXPORT void JNICALL Java_<package>_calculate(
       JNIEnv * env,
       jobject object,
       jfloatArray rgbObject,
       jfloat factor){
   jfloat* rgb = (*env)->GetFloatArrayElements(env,rgbObject,0);
   if(rgb==NULL) return;

   rgb[0]=5; // Test, crash!

   (*env)->ReleaseFloatArrayElements(env,rgb,rgbObject,0);
   }

但是,每当我尝试使用数组和某个值调用该函数时,我都会收到logcat消息:

A / libc(16064):致命信号11(SIGSEGV)位于0x00000010(代码= 1)

之后,应用程序崩溃了。我发现在写入浮点值时总会出现这种情况。阅读不会导致崩溃。

我有什么不对吗?是不是可以写出数组值?

3 个答案:

答案 0 :(得分:3)

我找到了解决方案! 出于某种原因,使用null值作为数组调用该函数。但是,rgb == NULL检查没有被触发(我不知道是出于哪个原因)。我通过在获取值

之前添加第二个检查来解决问题
JNIEXPORT void JNICALL Java_<package>_calculate(
       JNIEnv * env,
       jobject object,
       jfloatArray rgbObject,
       jfloat factor){
   if(rgbObject==NULL) return; // Check if incomming array is NULL-Pointer
   jfloat* rgb = (*env)->GetFloatArrayElements(env,rgbObject,0);
   if(rgb==NULL) return;

   rgb[0]=5; // Test, crash!

   (*env)->ReleaseFloatArrayElements(env,rgb,rgbObject,0);
   }

答案 1 :(得分:1)

当我使用Android NDK时遇到了同样的问题,我尝试释放C中编写的函数内的内存,最后得到SIGSEGV错误。我做的诀窍是在我的C代码中创建一个处理内存的函数,并在我完成Java中的特定操作后直接从Java调用此方法。我在C中调用了函数,以便清理内存。

答案 2 :(得分:0)

我和你有同样的问题并最终解决它。

我认为问题在于你没有在java代码中为jni初始化rgbObject。

我只是在我的代码中添加rgbObject = new int [5]然后就可以了。

你也可以像TSGames所说的那样做。

我认为我的感觉更好。