java jni stack
java jni stack
木辰寿 发表于3年前
java jni stack
  • 发表于 3年前
  • 阅读 7
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

 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;
共有 人打赏支持
粉丝 6
博文 12
码字总数 2815
×
木辰寿
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: