#define FREE_LOCAL_REF(ENV, O) do{\
if(O)\
{ \
(*ENV)->DeleteLocalRef(ENV, O);\
O=NULL;\
}\
}while(0)
#define CHECK_RETURN_NULL(O) do{\
if(!O)\
{\
return NULL;\
}\
}while(0)
#define FREE_ALLOC(O) do{\
if(O != NULL)\
{\
free(O);\
O = NULL;\
}\
}while(0)
#define RELEASE_BYTE_ARRAY(e, a, m) do{\
if(a != NULL){\
jbyte* elements = (*e)->GetByteArrayElements(e, a, 0);\
if(elements){\
(*e)->ReleaseByteArrayElements(e, a, elements, m);\
}\
FREE_LOCAL_REF(e, a);\
}\
}while(0)
#define FIND_CLASS(env, n) (*env)->FindClass(env, n)
#define NEW_OBJECT(env, c, m, ...) (*env)->NewObject(env, c, m, ##__VA_ARGS__)
#define GET_METHOD_ID(env, c, n, t) (*env)->GetMethodID(env, c, n, t)
#define GET_STATIC_METHOD_ID(env, c, n, t) (*env)->GetStaticMethodID(env, c, n, t)
#define CALL_METHOD(env, type, o, methodId, ...) (*env)->Call##type##Method(env, o, methodId, ##__VA_ARGS__)
#define CALL_VOID_METHOD(env, o, methodId, ...) CALL_METHOD(env, Void, o, methodId, ##__VA_ARGS__)
#define CALL_INT_METHOD(env, o, methodId, ...) CALL_METHOD(env, Int, o, methodId, ##__VA_ARGS__)
#define CALL_OBJECT_METHOD(env, o, methodId, ...) CALL_METHOD(env, Object, o, methodId, ##__VA_ARGS__)
#define CALL_BOOLEAN_METHOD(env, o, methodId, ...) CALL_METHOD(env, Boolean, o, methodId, ##__VA_ARGS__)
#define CALL_STATIC_METHOD(env, type, clz, methodId, ...) (*env)->CallStatic##type##Method(env, clz, methodId, ##__VA_ARGS__)
#define CALL_STATIC_OBJECT_METHOD(env, clz, methodId, ...) CALL_STATIC_METHOD(env, Object, clz, methodId, ##__VA_ARGS__)
#define CALL_STATIC_BOOLEAN_METHOD(env, clz, methodId, ...) CALL_STATIC_METHOD(env, Boolean, clz, methodId, ##__VA_ARGS__)
#define GET_OBJECT_CLASS(env, o) (*env)->GetObjectClass(env, o)
#define GET_FIELD_ID(env, c, n, t) (*env)->GetFieldID(env, c, n, t)
#define GET_OBJECT_FIELD(env, type, o, id) (*env)->Get##type##Field(env, o, id)
#define NEW_STRING_UTF(env, source) (*env)->NewStringUTF(env, source)
#define GET_STRING_UTF_CHARS(env, jstring) (*env)->GetStringUTFChars(env, jstring, 0)
#define LOGD(TAG, ...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__)
#define LOGI(TAG, ...) __android_log_print(ANDROID_LOG_INFO,TAG ,__VA_ARGS__)
#define LOGW(TAG, ...) __android_log_print(ANDROID_LOG_WARN,TAG ,__VA_ARGS__)
#define LOGE(TAG, ...) __android_log_print(ANDROID_LOG_ERROR,TAG ,__VA_ARGS__)
#define LOGF(TAG, ...) __android_log_print(ANDROID_LOG_FATAL,TAG ,__VA_ARGS__)
转载于:https://my.oschina.net/droidwolf/blog/2878220