当前位置: 首页 > 知识库问答 >
问题:

Android JNI:调用对象方法时的应用崩溃

公羊向荣
2023-03-14

我在Android中使用JNI时遇到了一个奇怪的问题。我获得了我的类SecureChannel的对象方法sendClearMessage()并调用了这个返回类MessageResponse的对象的方法。这个对象被分配给jobject,然后传递给CallObjectMethod以调用该类的一个方法。每当我调用这个类的方法时,应用程序就会在没有有用信息的情况下崩溃。我检查每个获得jmethodID或jclass值的函数,所以问题不在我获得这些参数的方式上。这是代码:

jobject sendMessage(char *ID , char *Message)
{
    jboolean isError;

    jmethodID SendClearMessage = NULL;
    jmethodID GetMessageResponseMethod = NULL;
    jmethodID IsErrorMethod = NULL;

    jobject ID_String = NULL;
    jobject Message_String = NULL;

    jbyte Length_Jbyte;

    jobject MessageResponse = NULL;
    jobject ResponseString = NULL;

    if(env == NULL || context == NULL) return NULL;

    if(SecureChannel == NULL)
    {
        SecureChannel = createSecureChannel(context);
    }

    if(SecureChannel == NULL)
    {
        return NULL;
    }

    ID_String = env->NewStringUTF(ID);
    Message_String = env->NewStringUTF(Message);

    SendClearMessage = getSecureChannelMethod("SendClearMessage" , "(Ljava/lang/String;Ljava/lang/String;)Lpkg/msg/MessageResponse;");

    if(SendClearMessage == NULL) return NULL;

    MessageResponse = env->CallObjectMethod(SecureChannel , SendClearMessage , ID_String , Message_String);

    //Check Exception throwing - DISABLED ever return true 
    /*
    if(env->ExceptionCheck() == true)
    {
        env->ExceptionDescribe();
        env->ExceptionClear();
        return NULL;
    }*/

    if(MessageResponse == NULL)
    {
        return NULL;
    }

    IsErrorMethod = getMessageResponseMethod("isError" , "()Z");

    if(IsErrorMethod == NULL) return NULL;

    isError = env->CallBooleanMethod(MessageResponse , IsErrorMethod); //Crash HERE

    if(isError == true) return NULL;

    GetMessageResponse = getMessageResponseMethod("getMessageResponse" , "()[B");

    if(GetMessageResponseMethod == NULL) return NULL;

    return env->CallObjectMethod(MessageResponse , GetMessageResponseMethod); //Crash HERE if I comment previous CallBooleanMethod
}

感谢任何帮助。

共有1个答案

梁兴修
2023-03-14

问题如下:在SendClearMessage之前,必须检查SecureChannel的连接状态,因为连接是异步的。如果未检查连接,则调用该方法,但对其他对象的进一步调用会导致崩溃,这可能是因为抛出了未处理的异常。事实上,我读到,当VM抛出异常时,必须只调用处理异常的方法:

http://developer.android.com/training/articles/perf-jni.html

 类似资料:
  • 7.2.3 对象方法的调用 一旦创建了对象,就可以通过向对象发消息来调用对象的方法。消息的格式如下: <对象>.<方法>(<实参>) 其含义是请求<对象>执行<方法>,方法定义中列出的形式参数由<实参>提供。 例如,接着前面的例子执行如下语句: >>> p1.whatName() My name is Lucy >>> p2.whatName() My name is Tom >>> p2.ho

  • 我目前正在使用OpenGL和GLFW开发一个跨平台的2D渲染引擎。我有一个名为GameWindow的基本窗口类,以及一个名为Game的继承GameWindow的类。游戏覆盖了基类中的一些虚拟方法,以便GameWindow可以处理帧限制等。在GameWindow的构造函数中,我使用glfwSetWindowSizeCallback指定窗口调整大小时要运行的方法。然后,此方法调用GameWindow的

  • 问题内容: 这是启动桌面版本时得到的: 我都试过这个政党成员和这一个,我也得到了同样的错误在同一直线上。 编辑: 我只是注意到我的.tmx文件的数据是由Tiled Map Editor自动编码的,所以我只是停用了它,但仍然遇到相同的错误。 如果我复制/粘贴该项目(我的意思是整个项目,不仅是render()方法),它会工作,但是当我尝试在自己的项目中加载自己的地图时,它只会崩溃… 因此,在那之后,我

  • 根据这个留档, 这些对象中的每一个的字符串表示都按照列出的顺序附加在一起并输出。 同样根据答案 x将对象x强制为一个字符串,即[object object]: 所以,我的问题是 如果我这样做 因此,在第一种情况下,它只打印对象(不调用方法)。 但是在第二种情况下,它不强制而是简单地打印原始值。为什么会这样呢? 哪种方法不支持调用以打印对象? 请注意-这不是这个问题的重复。

  • 问题内容: 我在调用 非静态 方法时感到困惑 我知道 method-1 和 method-2 都将调用 doThis() ,但是功能上有什么区别吗? 问题答案: 功能上有区别吗? 两者的行为方式相同。 第二个选项不允许您再次重用该实例。在单行return语句中可能很方便和简洁(例如,请考虑使用构建器模式,其中每个构造方法都将返回一个半初始化的实例): 或者创建一个对象仅执行一次定义的操作。 方法2

  • webrtc库调用某个内部方法并获取多余的\u错误。然后坠毁了 如果需要更多信息,请询问。 //代码 我在这里喝了一口。 此代理调用时发生崩溃。 事故报告 异常类型:EXC_BAD_ACCESS(SIGSEGV)异常子类型:KERN_在0x5000000000000038处的地址无效终止信号:分段错误:11终止原因:命名空间信号,代码0xb终止进程:由线程触发的EXC处理程序[0]:9 筛选的系统