2013-09-17 2 views
0

У меня странная проблема с использованием JNI в Android. я получаю метод объекта sendClearMessage() моего класса SecureChannel и я называю этот метод, который возвращает объект моего класса MessageResponse. Этот объект присваивается заданию и затем передается в CallObjectMethod для вызова метода этого класса. Всякий раз, когда я вызываю методы этого класса, приложение вылетает без полезной информации. Я проверяю каждую функцию, которая получает значения jmethodID или jclass, поэтому проблема не в том, как я получаю эти параметры. Это код:Android JNI: сбой приложения при вызове метода объекта

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». Если я прокомментирую оба метода, приложение не сработает, но я не могу увидеть ответ на сообщение таким образом.

Любая помощь приветствуется.

+0

Показать свой LogCat ... – krsteeve

+0

В частности, показать верхнюю часть нативного грохота, что debuggerd излучает (вам не нужен действительно длинный дамп, который следует за backtrace стека), плюс бит журнала, который приходит непосредственно перед ним. Если вы видите что-то вроде «Предупреждение JNI», это, вероятно, укажет вам на проблему. – fadden

+0

Пожалуйста, разместите свое решение в качестве ответа, чтобы вы могли в конце концов принять его, и вопрос будет казаться разрешенным, а не продолжением всплытия, поскольку ему нужно внимание. –

ответ

0

Проблема заключается в следующем: перед SendClearMessage необходимо проверить состояние соединения SecureChannel, поскольку соединение является асинхронным. Если соединение не проверено, метод вызывается, но дальнейший вызов другого объекта вызывает сбои, вероятно, потому, что выбрано необработанное исключение. На самом деле я прочитал, что только методы для обработки исключения должны быть вызван, когда VM бросает исключение:

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

Смежные вопросы