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