java jni stack

 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;

你可能感兴趣的:(java jni stack)