diff options
| author | Rajith Muditha Attapattu <rajith@apache.org> | 2012-06-07 17:34:55 +0000 |
|---|---|---|
| committer | Rajith Muditha Attapattu <rajith@apache.org> | 2012-06-07 17:34:55 +0000 |
| commit | 9c3aa371c909cd5cfcc56cd8bdb7bd2013aee7af (patch) | |
| tree | 5e4cb884d4819f817132fe60ea5c99379e2ae72e | |
| parent | 59e5686784ad16c2b0a353fca881b95f56287a8a (diff) | |
| download | qpid-python-9c3aa371c909cd5cfcc56cd8bdb7bd2013aee7af.tar.gz | |
QPID-4027 Added error handling and basic logging for the library onload
method. Using static_cast instead of the "C" style casts.
git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/address-refactor2@1347728 13f79535-47bb-0310-9956-ffa450edef68
| -rw-r--r-- | qpid/cpp/bindings/swig_java_cpp_helper.i | 55 | ||||
| -rw-r--r-- | qpid/java/client-api/src/main/java/org/apache/qpid/messaging/cpp/JNILayerException.java | 5 |
2 files changed, 39 insertions, 21 deletions
diff --git a/qpid/cpp/bindings/swig_java_cpp_helper.i b/qpid/cpp/bindings/swig_java_cpp_helper.i index 8fd0522d6a..e7b3332637 100644 --- a/qpid/cpp/bindings/swig_java_cpp_helper.i +++ b/qpid/cpp/bindings/swig_java_cpp_helper.i @@ -78,6 +78,7 @@ static jmethodID JAVA_DOUBLE_VALUE_METHOD; static jclass JAVA_ILLEGAL_ARGUMENT_EXP; static jclass JAVA_JNI_LAYER_EXP; +static jmethodID JAVA_JNI_LAYER_EXP_CTOR; // takes a msg and a throwable. static jobject createGlobalRef(JNIEnv* env,jobject obj) { @@ -94,6 +95,12 @@ static jmethodID getMethodID(JNIEnv* env, jclass clazz, const char* name, const return env->GetMethodID(clazz,name,sig); } +// TODO link up with log4j +static void printLog(const char* msg) +{ + std::cout << msg << std::endl; +} + /* * ========================= init() for the module ========================== * @@ -110,54 +117,58 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) return JNI_ERR; /* JNI version not supported */ } - std::cout << "Initializing module" << std::endl; + printLog("--- ** Initializing cqpid_java ** ---"); if (!env) { - std::cout << "JNI env ref is null!, aborting" << std::endl; + printLog("JNI env ref is null!, aborting"); + printLog("--- ** cqpid_java library loading failed! ** ---"); return JNI_ERR; } - JAVA_STRING_CLASS = (jclass)createGlobalRef(env,findClass(env,"java/lang/String")); - std::cout << "Loaded java string" << std::endl; + // The standard class loading should not fail :) + JAVA_STRING_CLASS = static_cast<jclass>(createGlobalRef(env,findClass(env,"java/lang/String"))); - JAVA_BOOLEAN_CLASS = (jclass)createGlobalRef(env,findClass(env,"java/lang/Boolean")); + JAVA_BOOLEAN_CLASS = static_cast<jclass>(createGlobalRef(env,findClass(env,"java/lang/Boolean"))); JAVA_BOOLEAN_CTOR = getMethodID(env,JAVA_BOOLEAN_CLASS, "<init>", "(Z)V"); JAVA_BOOLEAN_VALUE_METHOD = getMethodID(env,JAVA_BOOLEAN_CLASS,"booleanValue", "()Z"); - std::cout << "Loaded java boolean"<< std::endl; - JAVA_BYTE_CLASS = (jclass)createGlobalRef(env,findClass(env,"java/lang/Byte")); + JAVA_BYTE_CLASS = static_cast<jclass>(createGlobalRef(env,findClass(env,"java/lang/Byte"))); JAVA_BYTE_CTOR = getMethodID(env,JAVA_BYTE_CLASS, "<init>", "(B)V"); JAVA_BYTE_VALUE_METHOD = getMethodID(env,JAVA_BYTE_CLASS,"byteValue", "()B"); - std::cout << "Loaded java byte"<< std::endl; - JAVA_SHORT_CLASS = (jclass)createGlobalRef(env,findClass(env,"java/lang/Short")); + JAVA_SHORT_CLASS = static_cast<jclass>(createGlobalRef(env,findClass(env,"java/lang/Short"))); JAVA_SHORT_CTOR = getMethodID(env,JAVA_SHORT_CLASS, "<init>", "(S)V"); JAVA_SHORT_VALUE_METHOD = getMethodID(env,JAVA_SHORT_CLASS,"shortValue", "()S"); - std::cout << "Loaded java short"<< std::endl; - JAVA_INT_CLASS = (jclass)createGlobalRef(env,findClass(env,"java/lang/Integer")); + JAVA_INT_CLASS = static_cast<jclass>(createGlobalRef(env,findClass(env,"java/lang/Integer"))); JAVA_INT_CTOR = getMethodID(env,JAVA_INT_CLASS, "<init>", "(I)V"); JAVA_INT_VALUE_METHOD = getMethodID(env,JAVA_INT_CLASS,"intValue", "()I"); - std::cout << "Loaded java int"<< std::endl; - JAVA_LONG_CLASS = (jclass)createGlobalRef(env,findClass(env,"java/lang/Long")); + JAVA_LONG_CLASS = static_cast<jclass>(createGlobalRef(env,findClass(env,"java/lang/Long"))); JAVA_LONG_CTOR = getMethodID(env,JAVA_LONG_CLASS, "<init>", "(J)V"); JAVA_LONG_VALUE_METHOD = getMethodID(env,JAVA_LONG_CLASS,"longValue", "()J"); - std::cout << "Loaded java long"<< std::endl; - JAVA_DOUBLE_CLASS = (jclass)createGlobalRef(env,findClass(env,"java/lang/Double")); + JAVA_DOUBLE_CLASS = static_cast<jclass>(createGlobalRef(env,findClass(env,"java/lang/Double"))); JAVA_DOUBLE_CTOR = getMethodID(env,JAVA_DOUBLE_CLASS, "<init>", "(D)V"); JAVA_DOUBLE_VALUE_METHOD = getMethodID(env,JAVA_DOUBLE_CLASS,"doubleValue", "()D"); - std::cout << "Loaded java double"<< std::endl; - JAVA_FLOAT_CLASS = (jclass)createGlobalRef(env,findClass(env,"java/lang/Float")); + JAVA_FLOAT_CLASS = static_cast<jclass>(createGlobalRef(env,findClass(env,"java/lang/Float"))); JAVA_FLOAT_CTOR = getMethodID(env,JAVA_FLOAT_CLASS, "<init>", "(F)V"); JAVA_FLOAT_VALUE_METHOD = getMethodID(env,JAVA_FLOAT_CLASS,"floatValue", "()F"); - std::cout << "Loaded java float"<< std::endl; - JAVA_ILLEGAL_ARGUMENT_EXP = (jclass)createGlobalRef(env,findClass(env,"java/lang/IllegalArgumentException")); - JAVA_JNI_LAYER_EXP = (jclass)createGlobalRef(env,findClass(env,"org/apache/qpid/messaging/cpp/JNILayerException")); - std::cout << "Loaded java exceptions"<< std::endl; + JAVA_ILLEGAL_ARGUMENT_EXP = static_cast<jclass>(createGlobalRef(env,findClass(env,"java/lang/IllegalArgumentException"))); + JAVA_JNI_LAYER_EXP = static_cast<jclass>(createGlobalRef(env,findClass(env,"org/apache/qpid/messaging/cpp/JNILayerException"))); + JAVA_JNI_LAYER_EXP_CTOR = getMethodID(env,JAVA_JNI_LAYER_EXP, "<init>", "(Ljava/lang/String;Ljava/lang/Throwable;)V"); + + if (env->ExceptionCheck()) + { + // The JVM will throw an exception on the Java side. + printLog("Loading of one or more class or constructor definitions failed. See exception for details"); + printLog("--- ** cqpid_java library loading failed! ** ---"); + return JNI_ERR; + } + + printLog("--- ** cqpid_java library was loaded successfully ** ---"); return JNI_VERSION_1_4; } @@ -349,6 +360,8 @@ ReadOnlyVariantMapWrapper::~ReadOnlyVariantMapWrapper() } } +// **** handle unsupported types +// Add a generic error checking mechanism to see if the java methods have a thrown an error. jobject ReadOnlyVariantMapWrapper::get(const std::string key) const { using namespace qpid::types; diff --git a/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/cpp/JNILayerException.java b/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/cpp/JNILayerException.java index f5a210256c..9921c9e542 100644 --- a/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/cpp/JNILayerException.java +++ b/qpid/java/client-api/src/main/java/org/apache/qpid/messaging/cpp/JNILayerException.java @@ -25,4 +25,9 @@ public class JNILayerException extends RuntimeException super(message); } + public JNILayerException(String message, Throwable t) + { + super(message,t); + } + } |
