Android JNI访问Double类型数组时出现SIGABRT错误如何解决?
排查方向
- JNI函数返回值缺失
你提供的C层JNI函数没有声明返回值,对应Kotlin无返回值(Unit)的方法,C层必须显式声明返回void,否则JNI调用栈不匹配会直接触发SIGABRT。修正后的函数头示例:
void Java_com_mypackage_MyClass_myFunction(JNIEnv *env, jobject thiz, jdoubleArray myArray) { // 业务逻辑 }
- 入参空指针未做防护
如果Kotlin层传入空数组,直接调用GetDoubleArrayElements会触发空指针访问崩溃,需要先对myArray做非空校验:
if (myArray == NULL) { return; }
GetDoubleArrayElements参数使用错误
第三个参数要求传入jboolean*类型的指针,用于返回数组是否被JNI拷贝,你当前传入常量0,在部分架构上会触发非法地址访问,不需要感知拷贝状态时传入NULL即可:
jdouble *body_ = (*env)->GetDoubleArrayElements(env, myArray, NULL);
- 数组资源未释放
通过GetDoubleArrayElements获取的原生指针,使用完成后必须配对调用ReleaseDoubleArrayElements释放,否则会出现内存泄漏,累计后触发OOM导致SIGABRT:
// 数组使用完成后执行,mode传0代表更新Java层数组并释放原生内存 (*env)->ReleaseDoubleArrayElements(env, myArray, body_, 0);
- 命名规则不匹配
JNI函数名必须严格遵循Java_<包名替换下划线>_<类名>_<方法名>的规则,包名、类名、方法名任意一处不匹配都会导致运行时找不到方法触发崩溃。 - Kotlin层声明错误
Kotlin层对应的native方法必须用external关键字修饰,示例:
external fun myFunction(array: Array<Double>)
内容的提问来源于stack exchange,提问作者Ditscheridou
相关产品推荐
相关产品推荐

