/** * 判断对象类型 */ bool instanceof(JNIEnv *env, jobject obj, const char *clsName) { jclass targetcls = env->FindClass(clsName); return env->IsInstanceOf( obj, targetcls); } /** * 设置Field 整型值 */ void setIntField(JNIEnv *env, jobject obj, const char *fieldName, int value) { jobject refobj = env->NewLocalRef(obj); jclass targetcls = env->GetObjectClass(refobj); jfieldID fieldid = env->GetFieldID(targetcls, fieldName, "I"); if(fieldid == NULL) return; env->SetIntField(obj, fieldid, value); env->DeleteLocalRef(targetcls); env->DeleteLocalRef(refobj); } /** * 设置Field 字符串 */ void setStringField(JNIEnv *env, jobject obj, const char *fieldName, const char* value) { jobject refobj = env->NewLocalRef(obj); jclass targetcls = env->GetObjectClass(refobj); jfieldID fieldid = env->GetFieldID(targetcls, fieldName, "Ljava/lang/String;"); if(fieldid == NULL) return; env->SetObjectField(obj, fieldid, env->NewStringUTF(value)); env->DeleteLocalRef(targetcls); env->DeleteLocalRef(refobj); } /** * 设置Field 布尔值 */ void setBooleanField(JNIEnv *env, jobject obj, const char *fieldName, bool value) { jobject refobj = env->NewLocalRef(obj); jclass targetcls = env->GetObjectClass(refobj); jfieldID fieldid = env->GetFieldID(targetcls, fieldName, "Z"); if(fieldid == NULL) return; env->SetBooleanField(obj, fieldid, value); env->DeleteLocalRef(targetcls); env->DeleteLocalRef(refobj); } /** * 执行返回值为void的方法 */ void callVoidMethod(JNIEnv *env, jobject obj, const char *methodName, const char *sig, ...) { jobject refobj = env->NewLocalRef(obj); jclass targetcls = env->GetObjectClass(refobj); jmethodID mid = env->GetMethodID(targetcls, methodName, sig); if(mid == NULL){ return; } va_list ap; va_start(ap, sig); env->CallVoidMethodV(refobj, mid, ap); va_end(ap); env->DeleteLocalRef(targetcls); env->DeleteLocalRef(refobj); } /** * 执行返回值为Object的方法 */ jobject callJObjectMethod(JNIEnv *env, jobject obj, const char *methodName, const char *sig, ...) { jobject rtn; jobject refobj = env->NewLocalRef(obj); jclass targetcls = env->GetObjectClass(refobj); jmethodID mid = env->GetMethodID(targetcls, methodName, sig); if(mid == NULL){ return NULL; } va_list ap; va_start(ap, sig); rtn = env->CallObjectMethodV(refobj, mid, ap); va_end(ap); env->DeleteLocalRef(targetcls); env->DeleteLocalRef(refobj); return rtn; } /** * 设置字段值 */ void setField(JNIEnv *env, jboolean *hasException, jobject obj, const char *fieldName, const char *descriptor, const jvalue value) { jobject refobj; jclass targetcls; jfieldID fieldid; //判断本地版本 if(env->EnsureLocalCapacity(2) != JNI_OK) { goto error; } refobj = env->NewLocalRef(obj); targetcls = env->GetObjectClass(refobj); fieldid = env->GetFieldID(targetcls, fieldName, descriptor); if(fieldid == NULL) goto error; switch(*descriptor){ case '[': case 'L': env->SetObjectField(obj, fieldid, (jobject)value.l); break; case 'Z': env->SetBooleanField(obj, fieldid, (jboolean)value.z); break; case 'B': env->SetByteField(obj, fieldid, (jbyte)value.b); break; case 'C': env->SetCharField(obj, fieldid, (jchar)value.c); break; case 'S': env->SetShortField(obj, fieldid, (jshort)value.s); break; case 'I': env->SetIntField(obj, fieldid, (jint)value.i); break; case 'J': env->SetLongField(obj, fieldid, (jlong)value.j); break; case 'F': env->SetFloatField(obj, fieldid, (jfloat)value.f); break; case 'D': env->SetDoubleField(obj, fieldid, (jdouble)value.d); break; } env->DeleteLocalRef(targetcls); env->DeleteLocalRef(refobj); error: if(env->ExceptionOccurred()) { *hasException = env->ExceptionCheck(); // *hasException = true; // env->ExceptionDescribe(); // env->ExceptionClear(); // env->ThrowNew(targetcls, "error"); } }