首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从JNI调用exception.printStackTrace()

从JNI调用exception.printStackTrace()
EN

Stack Overflow用户
提问于 2013-04-11 13:23:42
回答 2查看 2.5K关注 0票数 0

问题是找出哪些Java函数调用了一些JNI函数。在Java语言中,这可以通过new Exception.printStackTrace()来实现,但这必须通过本机(JNI)函数来完成。

因为以后找到你自己的代码的最简单的方法就是把它发布到网上,所以我把问题和答案都贴出来了。

EN

回答 2

Stack Overflow用户

发布于 2013-04-11 13:24:18

new Exception.printStackTrace()类似的JNI是:

代码语言:javascript
复制
//#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}");
}
票数 4
EN

Stack Overflow用户

发布于 2013-04-11 13:29:40

顺便说一下,您可以从原生层向Java:)抛出一个异常,如下所示:

代码语言:javascript
复制
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中获取堆栈跟踪。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15941314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档