【问题标题】:Getting 'Fatal signal 11 (SIGSEGV) at 0x00000010 (code=1)' when writing into jfloat array写入 jfloat 数组时在 0x00000010 (code=1) 处获取“致命信号 11 (SIGSEGV)”
【发布时间】:2012-09-27 11:08:51
【问题描述】:

我目前正在使用 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)

之后,应用程序崩溃。我发现它总是在写入浮点值时发生。阅读不会导致崩溃。

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

【问题讨论】:

    标签: java android arrays android-ndk


    【解决方案1】:

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

    【讨论】:

    • 很好,您找到了解决方案! :) 您应该将您的答案设置为已接受,以便其他人可以发现这篇文章很有用。
    • 我知道,但是 Stackoverflow 说我应该至少等 2 天,所以我现在不能设置;)
    【解决方案2】:

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

    【讨论】:

    • 我试过了,谢谢你的想法。但是,如果我评论最后一行 (ReleaseFloatArrayElements),我仍然会不断收到相同的“致命信号 11”。由于某种原因,它对我不起作用。
    • 嗯,听起来很奇怪。您试图将其注释掉,那不是解决方案。尝试创建一个类似这样的新函数:JNIEXPORT void JNICALL Java_releaseMemory(JNIEnv * env) { (*env)-&gt;ReleaseFloatArrayElements(env,rgb,rgbObject,0); } 不是最好的答案,因为我面前没有我的代码。
    【解决方案3】:

    我和你有同样的问题,终于解决了。

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

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

    你也可以按照 TSGames 说的做。

    我觉得我的更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-02
      • 2012-12-10
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      相关资源
      最近更新 更多