JNI:jvmti使用Integer.pasteInt将jstring全数转换为jint会导致崩溃

问题描述

    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")));

这是我的代码 我尝试将jstring(“ 10029909473242”)转换为jint 但是,如果我尝试打印它,则会使vm崩溃。 有更好的解决方案吗? 谢谢。

    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,但是您还应该通过在每次ExceptionOccurred调用之后调用ExceptionCheckCall*Method来添加错误检查。然后返回JVM或调用ExceptionClear并继续执行本机代码。

,
char buf1[64];

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

解决

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...