调用GetStringChars时出现JNI致命错误

时间:2012-01-11 14:44:57

标签: java crash java-native-interface

我正在尝试为

编写本机函数
protected static native boolean _connect(String user, String password,
                                         String machine) throws Exception;

实施如下:

JNIEXPORT jboolean JNICALL Java_jniprint__1connect
(JNIEnv *env, jclass clazz, jstring _machine, jstring _user, jstring _pass)
{
cout << "Connecting !!!!!!!!" << endl;
const jchar *machine = env->GetStringChars(_machine, JNI_FALSE);    
cout << "after machine!!!!!!!!" << endl;
return JNI_FALSE;
}

当_machine参数不为null时,它是完美的,当它为null时 - jvm剧烈崩溃

 A fatal error has been detected by the Java Runtime Environment:  

  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d96019f, pid=16444, tid=10744  

 JRE version: 6.0_30-b12  
 Java VM: Java HotSpot(TM) Client VM (20.5-b03 mixed mode, sharing windows-x86 )  
 Problematic frame:  
 V  [jvm.dll+0xa019f]  

...

怎么回事?

2 个答案:

答案 0 :(得分:2)

你确定你没有把它传递给null吗? 编辑:很抱歉阅读马虎,你传递的是null。在那种情况下,它应该崩溃。

此外,您应该调用ReleaseStringchars(),否则将来的调用可能会崩溃(或者给您带来其他问题)。

编辑:使用-Xcheck运行jvm:jni在使用JNI进行开发时通常很有用。不确定它会对你有所帮助,但我认为无论如何我都应该抛弃它。

答案 1 :(得分:0)

将java端的字符串设置为null。你必须将该字符串设置为“”。