Android 从JNI调用exception.printStackTrace()

Android 从JNI调用exception.printStackTrace(),android,java-native-interface,Android,Java Native Interface,问题在于找出哪些Java函数调用某些JNI函数。在Java中,这可以通过new Exception.printStackTrace()实现,但这必须通过本机(JNI)函数完成 由于以后查找自己的代码最简单的方法是在“net”中发布,因此我将问题和答案都发布了。新异常的JNI模拟。printStackTrace()是: //#include <android/log.h> //#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG

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


由于以后查找自己的代码最简单的方法是在“net”中发布,因此我将问题和答案都发布了。

新异常的JNI模拟。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}");
}
/#包括
//#定义LOGD(…)\uuuuuAndroid\uLog\uPrint(android\uLog\uDebug,“~~~~~~~”,\uuuuuVA\uargs)
//#定义DLOG(…)\uuuuuAndroid\uLog\uPrint(android\uLog\uDebug、“~~~~~~~”、\uuuVA\uArgs)
无效printStackTrace(JNIEnv*env){
本月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月日日日日日日日日日日月月月月月月月月月月月月月月月月日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日月月月月月月月月月月月月月月月月月月月月月月日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日本35现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场#########printStackTrace{”);
jclass cls=env->FindClass(“java/lang/Exception”);
如果(cls!=NULL){
jmethodID构造函数=env->GetMethodID(cls,“,”()V”);
if(构造函数!=NULL){
jobject exc=env->NewObject(cls,构造函数);
如果(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”);}
/*释放本地ref*/
env->DeleteLocalRef(cls);
本月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月日日日日日日日日日日月月月月月月月月月月月月月月月月日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日月月月月月月月月月月月月月月月月月月月月月月日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日本35现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场#########printStackTrace});
}

新异常的JNI模拟。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}");
}
/#包括
//#定义LOGD(…)\uuuuuAndroid\uLog\uPrint(android\uLog\uDebug,“~~~~~~~”,\uuuuuVA\uargs)
//#定义DLOG(…)\uuuuuAndroid\uLog\uPrint(android\uLog\uDebug、“~~~~~~~”、\uuuVA\uArgs)
无效printStackTrace(JNIEnv*env){
本月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月日日日日日日日日日日月月月月月月月月月月月月月月月月日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日月月月月月月月月月月月月月月月月月月月月月月日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日本35现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场#########printStackTrace{”);
jclass cls=env->FindClass(“java/lang/Exception”);
如果(cls!=NULL){
jmethodID构造函数=env->GetMethodID(cls,“,”()V”);
if(构造函数!=NULL){
jobject exc=env->NewObject(cls,构造函数);
如果(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”);}
/*释放本地ref*/
env->DeleteLocalRef(cls);
本月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月日日日日日日日日日日月月月月月月月月月月月月月月月月日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日月月月月月月月月月月月月月月月月月月月月月月日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日本35现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场#########printStackTrace});
}

顺便说一句,您可以将异常从本机层抛出到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 );
}

或者,如果您有一个异常实例,只需将其抛出到Java层,然后在Java中获取堆栈跟踪。

顺便说一句,您可以将异常从本机层抛出到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中获取堆栈跟踪。

此代码将在Android上崩溃。env->CallObjectMethod(exc,printStackTrace);需要替换为env->CallVoidMethod(exc,printStackTrace);此代码将在Android上崩溃。env->CallObjectMethod(exc,printStackTrace);需要替换为env->CallVoidMethod(exc,printStackTrace);