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 调用后调用 ExceptionOccurredExceptionCheck 来额外添加错误检查。然后 return 到 JVM 或调用 ExceptionClear 并在本机代码中继续。

char buf1[64];

sprintf(buf1, "%d", p);

已解决