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

C++调用JNI传递字符串时触发SIGSEGV崩溃问题求助

问题根因

崩溃的核心原因是JNI方法签名填写错误:
你Java代码中定义的hello方法接收单个String类型参数,对应的JNI方法签名应为(Ljava/lang/String;)V,但你C++代码中调用GetStaticMethodID时填写的签名是([Ljava/lang/String;)V,前缀多了一个[。
在JNI类型签名规则里,[代表数组类型,你填写的签名对应的是参数为String[]的方法,和实际的hello方法签名不匹配,导致GetStaticMethodID返回NULL,后续CallStaticVoidMethod传入空的方法ID触发空指针访问,对应崩溃日志里的si_addr: 0x0000000000000000就是典型的空指针访问特征。

修复方案

将C++代码中获取hello方法ID的行修改为:

jmethodID hello_method = env->GetStaticMethodID(hello_world_class, "hello", "(Ljava/lang/String;)V");
额外优化建议
  • 每次调用FindClass、GetStaticMethodID这类JNI接口后,增加非空判断,能快速定位类找不到、方法/字段签名不匹配这类常见问题,避免后续无意义的空指针崩溃。
  • 调用NewStringUTF创建的jstring属于JNI局部引用,使用完成后建议调用env->DeleteLocalRef(argString)主动释放,避免局部引用表溢出。

内容的提问来源于stack exchange,提问作者ervinbosenbacher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:06:02