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
相关产品推荐
相关产品推荐

