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

TSG*_*mes 5 java arrays android android-ndk

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

public static native void calculate(float[] rgb,float factor);
Run Code Online (Sandbox Code Playgroud)

然后,我写了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);
   }
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

TSG*_*mes 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);
   }
Run Code Online (Sandbox Code Playgroud)