code_junkie

Why does my JNI code not successfully find a jthrowable's getMessage method?

Nov 11th, 2011
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.07 KB | None | 0 0
  1. jthrowable java_exception;
  2. jclass java_class;
  3. jmethodID method;
  4.  
  5. java_exception = (*jEnv)->ExceptionOccurred(jEnv);
  6. assert (java_exception != NULL);
  7. java_class = (*jEnv)->GetObjectClass (jEnv, java_exception);
  8. assert (java_class != NULL);
  9. method = (*jEnv)->GetMethodID (jEnv, java_class, "getMessage", "()Ljava/lang/String;");
  10. if (method == NULL) {
  11. printf ("Seriously, how do I get here?!n");
  12. (*jEnv)->ExceptionDescribe (jEnv);
  13. return;
  14. }
  15.  
  16. java_class = (*jEnv)->FindClass (jEnv, "java/lang/Throwable");
  17. method = (*jEnv)->GetMethodID (jEnv, java_class, "getMessage", "()Ljava/lang/String;");
  18.  
  19. #include <cstdio>
  20. #include <jni.h>
  21.  
  22. int
  23. main(int argc, char** argv)
  24. {
  25. if (argc != 3) {
  26. std::fprintf(stderr, "usage: %s class messagen", argv[0]);
  27. return 1;
  28. }
  29.  
  30. JavaVM* jvm;
  31. void* penv;
  32. JavaVMInitArgs args = {JNI_VERSION_1_6};
  33.  
  34. if (jint res = JNI_CreateJavaVM(&jvm, &penv, &args)) {
  35. std::fprintf(stderr, "Can's create JVM: %dn", res);
  36. return -res;
  37. }
  38.  
  39. JNIEnv* env(static_cast<JNIEnv*>(penv));
  40. jint vers(env->GetVersion());
  41. std::printf("JNI version %d.%dn", vers >> 16, vers & 0xffff);
  42.  
  43. env->ThrowNew(env->FindClass(argv[1]), argv[2]);
  44. jthrowable exc(env->ExceptionOccurred());
  45. std::printf("Exception: %pn", exc);
  46. if (exc) {
  47. jclass exccls(env->GetObjectClass(exc));
  48. jclass clscls(env->FindClass("java/lang/Class"));
  49.  
  50. jmethodID getName(env->GetMethodID(clscls, "getName", "()Ljava/lang/String;"));
  51. jstring name(static_cast<jstring>(env->CallObjectMethod(exccls, getName)));
  52. char const* utfName(env->GetStringUTFChars(name, 0));
  53.  
  54. jmethodID getMessage(env->GetMethodID(exccls, "getMessage", "()Ljava/lang/String;"));
  55. jstring message(static_cast<jstring>(env->CallObjectMethod(exc, getMessage)));
  56. char const* utfMessage(env->GetStringUTFChars(message, 0));
  57.  
  58. std::printf("Exception: %s: %sn", utfName, utfMessage);
  59. env->ReleaseStringUTFChars(message, utfMessage);
  60. env->ReleaseStringUTFChars(name, utfName);
  61. }
  62. return -jvm->DestroyJavaVM();
  63. }
Add Comment
Please, Sign In to add comment