从 JNI 调用Exception.printStackTrace()

184*_*615 0 java-native-interface android

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

由于稍后找到自己的代码的最简单方法是将其发布在“网络”中,因此我同时发布了问题和答案。

184*_*615 5

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}");
}
Run Code Online (Sandbox Code Playgroud)