Android JNI :调用对象方法时应用程序崩溃
Android JNI : The app crash when an object method is called
我在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
}
函数getSecureChannelMethod和getMessageResponseMethod是我为返回指定类的jmethodID而编写的函数。如果我在调用 sendClearMessage 方法后启用异常检查,我会得到一个真正的值,但在 Logcat 上我看不到任何异常。如果我评论IsError方法的调用,则崩溃发生在另一个方法"GetMessageResponse"的调用上。如果我评论这两种方法,应用程序不会崩溃,但我看不到以这种方式获取消息响应。
任何帮助,不胜感激。
问题如下:在发送 SendClearMessage 之前,必须检查安全通道的连接状态,因为连接是异步的。如果未检查连接,则会调用该方法,但进一步调用其他对象会导致崩溃,这可能是因为抛出了未处理的异常。事实上,我已经读到,当 VM 引发异常时,只有处理异常的方法必须调用:
http://developer.android.com/training/articles/perf-jni.html
相关文章:
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 如何找出应用程序崩溃的原因 - Win 10 LTSB
- 操纵安卓相机的深度图导致应用程序崩溃
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误
- QCompleter set模型使应用程序崩溃
- Qt 5 应用程序崩溃并出现"qLineEdit::setText"
- 切换NvAPI_Stereo_Deactivate/NvAPI_Stereo_activate会使unity应用程序崩溃
- eglSwapBuffers上的应用程序崩溃
- VLD 使应用程序崩溃
- 由于调用 std::condition_variable 后参数无效而导致应用程序崩溃
- 执行递归函数时 C++ 应用程序崩溃
- 在 C++/CLI/C# 项目中启用"Native Code Debugging"导致应用程序崩溃
- LOCAL_SHARED_LIBRARIES使我的应用程序崩溃
- 为什么使用 nullPtr 调用函数不会使我的应用程序崩溃
- 当删除上下文属性中的QLIST对象时,QT QML应用程序崩溃
- React 本机 0.59 应用程序崩溃并出现 libc 错误
- 当使用“制造”编译的程序中使用库时,应用程序崩溃
- 如何在导致应用程序崩溃的代码中修复指令
- C++多线程应用程序崩溃
- 当使用 /ENTRY:main 和 /MT 运行时库编译为 /SUBSYSTEM:WINDOWS 时,应用程序崩溃