JNI:converting jstring(full of number) into jint using Integer.pasteInt by jvmti caused Crash
JNI:converting jstring(full of number) into jint using Integer.pasteInt by jvmti caused Crash
jclass in = jniEnv->FindClass("java/lang/Integer");
jmethodID ipi = jniEnv->GetStaticMethodID(in, "parseInt", "(Ljava/lang/String;)I");
jint test = jniEnv->CallStaticIntMethod(in, ipi, (jstring)jniEnv->CallStaticObjectMethod(System, getProperty, jniEnv->NewStringUTF("input")));
这是我的代码
我尝试将字符串(“10029909473242”)转换为关节
但是,如果我尝试打印它,它会使虚拟机崩溃。
有更好的解决方案吗?
谢谢
jclass JOptionPane = jniEnv->FindClass("javax/swing/JOptionPane");
jmethodID showInputDialog = jniEnv->GetStaticMethodID(JOptionPane, "showInputDialog", "(Ljava/lang/Object;)Ljava/lang/String;");
jniEnv->CallStaticObjectMethod(NULL, showInputDialog, test);
您没有显示实际错误,但我可以猜出一个原因:
10029909473242 太大,装不进 Java int
所以我打赌 Integer.parseInt
扔了 NumberFormatException
。调用任何带有未决异常的 JNI 方法都会使 JVM 崩溃。
这里的根本原因是您应该改用 Long.parseLong
,但您应该通过在每次 Call*Method
调用后调用 ExceptionOccurred
或 ExceptionCheck
来额外添加错误检查。然后 return 到 JVM 或调用 ExceptionClear
并在本机代码中继续。
char buf1[64];
sprintf(buf1, "%d", p);
已解决
jclass in = jniEnv->FindClass("java/lang/Integer");
jmethodID ipi = jniEnv->GetStaticMethodID(in, "parseInt", "(Ljava/lang/String;)I");
jint test = jniEnv->CallStaticIntMethod(in, ipi, (jstring)jniEnv->CallStaticObjectMethod(System, getProperty, jniEnv->NewStringUTF("input")));
这是我的代码 我尝试将字符串(“10029909473242”)转换为关节 但是,如果我尝试打印它,它会使虚拟机崩溃。 有更好的解决方案吗? 谢谢
jclass JOptionPane = jniEnv->FindClass("javax/swing/JOptionPane");
jmethodID showInputDialog = jniEnv->GetStaticMethodID(JOptionPane, "showInputDialog", "(Ljava/lang/Object;)Ljava/lang/String;");
jniEnv->CallStaticObjectMethod(NULL, showInputDialog, test);
您没有显示实际错误,但我可以猜出一个原因:
10029909473242 太大,装不进 Java int
所以我打赌 Integer.parseInt
扔了 NumberFormatException
。调用任何带有未决异常的 JNI 方法都会使 JVM 崩溃。
这里的根本原因是您应该改用 Long.parseLong
,但您应该通过在每次 Call*Method
调用后调用 ExceptionOccurred
或 ExceptionCheck
来额外添加错误检查。然后 return 到 JVM 或调用 ExceptionClear
并在本机代码中继续。
char buf1[64];
sprintf(buf1, "%d", p);
已解决