You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:36:01