2012-09-27 50 views
5

我正在用ndk实现一个android函数。 我声明如下当写入jfloat数组时,将'致命信号11(SIGSEGV)写入0x00000010'(代码= 1)'

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

Java中的功能,那么,我写的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)

AF那应用程序崩溃了。我发现写入浮点值时总会发生。阅读不会导致崩溃。

我有什么问题吗?是不是可以写数组值?

回答

3

我找到了解决方案! 出于某种原因,该函数被用一个空值作为数组调用。但是,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); 
    } 
+0

很好,你找到了解决方案! :)你应该设置你的答案为接受,所以其他人可以找到这篇文章有用。 –

+0

我知道,但Stackoverflow说我应该等待至少2天,所以我现在不能设置它;) – TSGames

1

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

+0

我试过这个,感谢这个想法。但是如果我评论最后一行(ReleaseFloatArrayElements),我仍然会得到相同的'致命信号11'。由于某种原因,它不适用于我。 – TSGames

+0

嗯,听起来很奇怪。你试图评论它,那不会是解决方案。尝试创建一个如下所示的新函数:'JNIEXPORT void JNICALL Java_releaseMemory(JNIEnv * env){(* env) - > ReleaseFloatArrayElements(env,rgb,rgbObject,0); }不是最好的答案,因为我没有我的代码。 –

0

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

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

我只是在我的代码中添加rgbObject = new int [5],然后就可以了。你也可以像TSGames说的那样做。

我觉得我更好。

相关问题