JNIEnv *env = NULL;
jint result = -1;
if ((*vm)->GetEnv(vm,(void**)&env,JNI_VERSION_1_4)) {
return -1;
}
result = JNI_VERSION_1_4;
jclass threadcls = (*env)->FindClass(env, "java/lang/Thread");
jclass StackTraceElement =(*env)->FindClass(env, "java/lang/StackTraceElement");
jmethodID Thread_currentThread = (*env)->GetStaticMethodID(env, threadcls, "currentThread","()Ljava/lang/Thread;");
jobject currentThread = (*env)->CallStaticObjectMethod(env, threadcls,Thread_currentThread);
LOG_DEBUG("song", "jni 1");
jmethodID Thread_getStackTrace = (*env)->GetMethodID(env, threadcls, "getStackTrace","()[Ljava/lang/StackTraceElement;");
jobjectArray stes = (*env)->CallObjectMethod(env, currentThread, Thread_getStackTrace);
jsize stes_length = (*env)->GetArrayLength(env, stes);
jmethodID StackTraceElement_getClassName = (*env)->GetMethodID(env, StackTraceElement,"getClassName","()Ljava/lang/String;");
LOG_DEBUG("song", "jni 2 %p %d", stes, stes_length);
// jobject j_class_name = (*env)->CallObjectMethod(env, );
int i= 0;
for (i=0; i<stes_length; i++) {
jobject j_class_name = (*env)->CallObjectMethod(env, (*env)->GetObjectArrayElement(env, stes, i), StackTraceElement_getClassName);
char *class_name = (*env)->GetStringUTFChars(env, j_class_name, NULL);
LOG_DEBUG("song", "jni 3 %s", class_name);
(*env)->ReleaseStringUTFChars(env, j_class_name, class_name);
(*env)->DeleteLocalRef(env, j_class_name);
}
(*env)->DeleteLocalRef(env, threadcls);
(*env)->DeleteLocalRef(env, StackTraceElement);
(*env)->DeleteLocalRef(env, currentThread);
(*env)->DeleteLocalRef(env, stes);
return result;
转载于:https://my.oschina.net/muchenshou/blog/380572