java - 写入 jfloat 数组时获取 'Fatal signal 11 (SIGSEGV) at 0x00000010 (code=1)'

标签 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):0x00000010 处的致命信号 11 (SIGSEGV)(代码=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);
   }

关于java - 写入 jfloat 数组时获取 'Fatal signal 11 (SIGSEGV) at 0x00000010 (code=1)',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12619984/

相关文章:

java - Android 错误

c - 释放数组中的结构时双重释放

java - 如何将现有文件对象分配给另一个文件对象

android - 使用底部导航和导航组件在选项卡之间传递数据

android - Google Play 构建的 A/B 测试

arrays - 生成并显示分数系列

javascript - 从 JSON 缓冲区中提取的数组类型元素未显示数组的常用属性(在 NodeJS 中)

java - google oauth2 使用 user@gmail.com 模拟服务帐户

java - 通过缩放级别更改半径

java - 无法在 JUnit 测试用例中覆盖 List<Tuple>