Arhn - архитектура программирования

вызов exception.printStackTrace() из JNI

Проблема состоит в том, чтобы выяснить, какие функции Java вызывают ту или иную функцию JNI. В Java это было бы достигнуто с помощью new Exception.printStackTrace(), но это должно быть сделано из собственной (JNI) функции.

Так как самый простой способ потом найти свой собственный код - это опубликовать его в инете, выкладываю и вопрос и ответ.


Ответы:


1

Аналог JNI new Exception.printStackTrace():

//#include <android/log.h>
//#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG  , "~~~~~~", __VA_ARGS__)
//#define DLOG(...) __android_log_print(ANDROID_LOG_DEBUG  , "~~~~~~", __VA_ARGS__)
void printStackTrace(JNIEnv *env) {
LOGD("###################################################################################printStackTrace{");
    jclass cls = env->FindClass("java/lang/Exception");
    if (cls != NULL) {
        jmethodID constructor = env->GetMethodID(cls, "<init>", "()V");
        if(constructor != NULL) {
            jobject exc = env->NewObject(cls, constructor);
            if(exc != NULL) {
                jmethodID printStackTrace = env->GetMethodID(cls, "printStackTrace", "()V");
                if(printStackTrace != NULL) {
                    env->CallObjectMethod(exc, printStackTrace);
                } else { DLOG("err4"); }
            } else { DLOG("err3"); }
            env->DeleteLocalRef(exc);
        } else { DLOG("err2"); }
    } else { DLOG("err1"); }
    /* free the local ref */
    env->DeleteLocalRef(cls);
LOGD("###################################################################################printStackTrace}");
}
11.04.2013
  • Этот код вылетит на Android. env-›CallObjectMethod(exc, printStackTrace); необходимо заменить на env-›CallVoidMethod(exc, printStackTrace); 29.12.2020

  • 2

    Кстати, вы можете бросить исключение из нативного слоя в Java:) Как-то так:

    jint throwOutOfMemoryError( JNIEnv *env, char *message ){
        jclass       exClass;
        char *className = "java/lang/OutOfMemoryError" ;
    
        exClass = (*env)->FindClass( env, className );
        if ( exClass == NULL ){
            return throwNoClassDefError( env, className );
        }
        return (*env)->ThrowNew( env, exClass, message );
    }
    

    Или, если у вас есть экземпляр Exception, просто добавьте его в слой Java, а затем получите трассировку стека в Java.

    11.04.2013
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..