我在 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”时发生崩溃。如果我评论这两种方法,应用程序不会崩溃,但我看不到以这种方式获取消息响应。
任何帮助表示赞赏。