JNIEnv 结构参考

来源:互联网 发布:80端口被系统占用 编辑:程序博客网 时间:2024/06/06 20:17
在反编译Android NDK编译的.so库文件的时候,一般情况下会看到两种方式的函数调用:
方式一
BL      _ZN7_JNIEnv11GetMethodIDEP7_jclassPKcS3_ ; _JNIEnv::GetMethodID(_jclass *,char const*,char const*) 
一看就知道调用了什么函数。
方式二
.text:00004A90                 LDR     R3, [R5] ; R5是_JNIEnv对象.text:00004A92                 MOVS    R1, R4 ;context 对象.text:00004A94                 MOVS    R0, R5  ;JNIEnv.text:00004A96                 LDR     R3, [R3,#0x7C] ;这里拿到的是GetObjectClass函数.text:00004A98                 BLX     R3 ;这样就拿到了context对象的class
那怎么知道 [R3,#0x7C] 就是GetObjectClass函数的地址呢?看下面JNINativeInterface 数据结构
0x7c / 4 = 31 
刚好是
jclass(*GetObjectClass)(JNIEnv*, jobject);
struct JNINativeInterface {void*reserved0;void*reserved1;void*reserved2;void*reserved3;jint(*GetVersion)(JNIEnv*);jclass(*DefineClass)(JNIEnv*, jobject, const jbyte*, jsize);jclass(*FindClass)(JNIEnv*, const char*);void*reserved4;void*reserved5;void*reserved6;jclass(*GetSuperClass)(JNIEnv*, jclass);jbool(*IsAssignableFrom)(JNIEnv*, jclass, jclass);void*reserved7;jint(*Throw)(JNIEnv*, jobject);jint(*ThrowNew)(JNIEnv*, jclass, const char*);jthrowable (*ExceptionOccurred)(JNIEnv*);void(*ExceptionDescribe)(JNIEnv*);void(*ExceptionClear)(JNIEnv*);void(*FatalError)(JNIEnv*, const char*);void*reserved8;void*reserved9;jref(*NewGlobalRef)(JNIEnv*, jref);void(*DeleteGlobalRef)(JNIEnv*, jref);void(*DeleteLocalRef)(JNIEnv*, jref);jbool(*IsSameObject)(JNIEnv*, jobject, jobject);void*reserved10;void*reserved11;jobject(*AllocObject)(JNIEnv*, jclass);jobject(*NewObject)(JNIEnv*, jclass, jmethodID, ...);jobject(*NewObjectV)(JNIEnv*, jclass, jmethodID, va_list);jobject(*NewObjectA)(JNIEnv*, jclass, jmethodID, jvalue*);jclass(*GetObjectClass)(JNIEnv*, jobject);jbool(*IsInstanceOf)(JNIEnv*, jobject, jclass);jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);jobject(*CallObjectMethod)(JNIEnv*, jobject, jmethodID, ...);jobject(*CallObjectMethodV)(JNIEnv*, jobject, jmethodID, va_list);jobject(*CallObjectMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);jbool(*CallBooleanMethod)(JNIEnv*, jobject, jmethodID, ...);jbool(*CallBooleanMethodV)(JNIEnv*, jobject, jmethodID, va_list);jbool(*CallBooleanMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);jbyte(*CallByteMethod)(JNIEnv*, jobject, jmethodID, ...);jbyte(*CallByteMethodV)(JNIEnv*, jobject, jmethodID, va_list);jbyte(*CallByteMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);jchar(*CallCharMethod)(JNIEnv*, jobject, jmethodID, ...);jchar(*CallCharMethodV)(JNIEnv*, jobject, jmethodID, va_list);jchar(*CallCharMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);jshort(*CallShortMethod)(JNIEnv*, jobject, jmethodID, ...);jshort(*CallShortMethodV)(JNIEnv*, jobject, jmethodID, va_list);jshort(*CallShortMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);jint(*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);jint(*CallIntMethodV)(JNIEnv*, jobject, jmethodID, va_list);jint(*CallIntMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);jlong(*CallLongMethod)(JNIEnv*, jobject, jmethodID, ...);jlong(*CallLongMethodV)(JNIEnv*, jobject, jmethodID, va_list);jlong(*CallLongMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);jfloat(*CallFloatMethod)(JNIEnv*, jobject, jmethodID, ...);jfloat(*CallFloatMethodV)(JNIEnv*, jobject, jmethodID, va_list);jfloat(*CallFloatMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);jdouble(*CallDoubleMethod)(JNIEnv*, jobject, jmethodID, ...);jdouble(*CallDoubleMethodV)(JNIEnv*, jobject, jmethodID, va_list);jdouble(*CallDoubleMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);void(*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);void(*CallVoidMethodV)(JNIEnv*, jobject, jmethodID, va_list);void(*CallVoidMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);jobject(*CallNonvirtualObjectMethod)(JNIEnv*, jobject, jclass, jmethodID, ...);jobject(*CallNonvirtualObjectMethodV)(JNIEnv*, jobject, jclass, jmethodID, va_list);jobject(*CallNonvirtualObjectMethodA)(JNIEnv*, jobject, jclass, jmethodID, jvalue*);jbool(*CallNonvirtualBooleanMethod)(JNIEnv*, jobject, jclass, jmethodID, ...);jbool(*CallNonvirtualBooleanMethodV)(JNIEnv*, jobject, jclass, jmethodID, va_list);jbool(*CallNonvirtualBooleanMethodA)(JNIEnv*, jobject, jclass, jmethodID, jvalue*);jbyte(*CallNonvirtualByteMethod)(JNIEnv*, jobject, jclass, jmethodID, ...);jbyte(*CallNonvirtualByteMethodV)(JNIEnv*, jobject, jclass, jmethodID, va_list);jbyte(*CallNonvirtualByteMethodA)(JNIEnv*, jobject, jclass, jmethodID, jvalue*);jchar(*CallNonvirtualCharMethod)(JNIEnv*, jobject, jclass, jmethodID, ...);jchar(*CallNonvirtualCharMethodV)(JNIEnv*, jobject, jclass, jmethodID, va_list);jchar(*CallNonvirtualCharMethodA)(JNIEnv*, jobject, jclass, jmethodID, jvalue*);jshort(*CallNonvirtualShortMethod)(JNIEnv*, jobject, jclass, jmethodID, ...);jshort(*CallNonvirtualShortMethodV)(JNIEnv*, jobject, jclass, jmethodID, va_list);jshort(*CallNonvirtualShortMethodA)(JNIEnv*, jobject, jclass, jmethodID, jvalue*);jint(*CallNonvirtualIntMethod)(JNIEnv*, jobject, jclass, jmethodID, ...);jint(*CallNonvirtualIntMethodV)(JNIEnv*, jobject, jclass, jmethodID, va_list);jint(*CallNonvirtualIntMethodA)(JNIEnv*, jobject, jclass, jmethodID, jvalue*);jlong(*CallNonvirtualLongMethod)(JNIEnv*, jobject, jclass, jmethodID, ...);jlong(*CallNonvirtualLongMethodV)(JNIEnv*, jobject, jclass, jmethodID, va_list);jlong(*CallNonvirtualLongMethodA)(JNIEnv*, jobject, jclass, jmethodID, jvalue*);jfloat(*CallNonvirtualFloatMethod)(JNIEnv*, jobject, jclass, jmethodID, ...);jfloat(*CallNonvirtualFloatMethodV)(JNIEnv*, jobject, jclass, jmethodID, va_list);jfloat(*CallNonvirtualFloatMethodA)(JNIEnv*, jobject, jclass, jmethodID, jvalue*);jdouble(*CallNonvirtualDoubleMethod)(JNIEnv*, jobject, jclass, jmethodID, ...);jdouble(*CallNonvirtualDoubleMethodV)(JNIEnv*, jobject, jclass, jmethodID, va_list);jdouble(*CallNonvirtualDoubleMethodA)(JNIEnv*, jobject, jclass, jmethodID, jvalue*);void(*CallNonvirtualVoidMethod)(JNIEnv*, jobject, jclass, jmethodID, ...);void(*CallNonvirtualVoidMethodV)(JNIEnv*, jobject, jclass, jmethodID, va_list);void(*CallNonvirtualVoidMethodA)(JNIEnv*, jobject, jclass, jmethodID, jvalue*);jfieldID (*GetFieldID)(JNIEnv*, jclass, const char*, const char*);jobject(*GetObjectField)(JNIEnv*, jobject, jfieldID);jbool(*GetBooleanField)(JNIEnv*, jobject, jfieldID);jbyte(*GetByteField)(JNIEnv*, jobject, jfieldID);jchar(*GetCharField)(JNIEnv*, jobject, jfieldID);jshort(*GetShortField)(JNIEnv*, jobject, jfieldID);jint(*GetIntField)(JNIEnv*, jobject, jfieldID);jlong(*GetLongField)(JNIEnv*, jobject, jfieldID);jfloat(*GetFloatField)(JNIEnv*, jobject, jfieldID);jdouble(*GetDoubleField)(JNIEnv*, jobject, jfieldID);void(*SetObjectField)(JNIEnv*, jobject, jfieldID, jobject);void(*SetBooleanField)(JNIEnv*, jobject, jfieldID, jbool);void(*SetByteField)(JNIEnv*, jobject, jfieldID, jbyte);void(*SetCharField)(JNIEnv*, jobject, jfieldID, jchar);void(*SetShortField)(JNIEnv*, jobject, jfieldID, jshort);void(*SetIntField)(JNIEnv*, jobject, jfieldID, jint);void(*SetLongField)(JNIEnv*, jobject, jfieldID, jlong);void(*SetFloatField)(JNIEnv*, jobject, jfieldID, jfloat);void(*SetDoubleField)(JNIEnv*, jobject, jfieldID, jdouble);jmethodID (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);jobject(*CallStaticObjectMethod)(JNIEnv*, jclass, jmethodID, ...);jobject(*CallStaticObjectMethodV)(JNIEnv*, jclass, jmethodID, va_list);jobject(*CallStaticObjectMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);jbool(*CallStaticBooleanMethod)(JNIEnv*, jclass, jmethodID, ...);jbool(*CallStaticBooleanMethodV)(JNIEnv*, jclass, jmethodID, va_list);jbool(*CallStaticBooleanMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);jbyte(*CallStaticByteMethod)(JNIEnv*, jclass, jmethodID, ...);jbyte(*CallStaticByteMethodV)(JNIEnv*, jclass, jmethodID, va_list);jbyte(*CallStaticByteMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);jchar(*CallStaticCharMethod)(JNIEnv*, jclass, jmethodID, ...);jchar(*CallStaticCharMethodV)(JNIEnv*, jclass, jmethodID, va_list);jchar(*CallStaticCharMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);jshort(*CallStaticShortMethod)(JNIEnv*, jclass, jmethodID, ...);jshort(*CallStaticShortMethodV)(JNIEnv*, jclass, jmethodID, va_list);jshort(*CallStaticShortMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);jint(*CallStaticIntMethod)(JNIEnv*, jclass, jmethodID, ...);jint(*CallStaticIntMethodV)(JNIEnv*, jclass, jmethodID, va_list);jint(*CallStaticIntMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);jlong(*CallStaticLongMethod)(JNIEnv*, jclass, jmethodID, ...);jlong(*CallStaticLongMethodV)(JNIEnv*, jclass, jmethodID, va_list);jlong(*CallStaticLongMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);jfloat(*CallStaticFloatMethod)(JNIEnv*, jclass, jmethodID, ...);jfloat(*CallStaticFloatMethodV)(JNIEnv*, jclass, jmethodID, va_list);jfloat(*CallStaticFloatMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);jdouble(*CallStaticDoubleMethod)(JNIEnv*, jclass, jmethodID, ...);jdouble(*CallStaticDoubleMethodV)(JNIEnv*, jclass, jmethodID, va_list);jdouble(*CallStaticDoubleMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);void(*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);void(*CallStaticVoidMethodV)(JNIEnv*, jclass, jmethodID, va_list);void(*CallStaticVoidMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);jfieldID (*GetStaticFieldID)(JNIEnv*, jclass, const char*, const char*);jobject(*GetStaticObjectField)(JNIEnv*, jclass, jfieldID);jbool(*GetStaticBooleanField)(JNIEnv*, jclass, jfieldID);jbyte(*GetStaticByteField)(JNIEnv*, jclass, jfieldID);jchar(*GetStaticCharField)(JNIEnv*, jclass, jfieldID);jshort(*GetStaticShortField)(JNIEnv*, jclass, jfieldID);jint(*GetStaticIntField)(JNIEnv*, jclass, jfieldID);jlong(*GetStaticLongField)(JNIEnv*, jclass, jfieldID);jfloat(*GetStaticFloatField)(JNIEnv*, jclass, jfieldID);jdouble(*GetStaticDoubleField)(JNIEnv*, jclass, jfieldID);void(*SetStaticObjectField)(JNIEnv*, jclass, jfieldID, jobject);void(*SetStaticBooleanField)(JNIEnv*, jclass, jfieldID, jbool);void(*SetStaticByteField)(JNIEnv*, jclass, jfieldID, jbyte);void(*SetStaticCharField)(JNIEnv*, jclass, jfieldID, jchar);void(*SetStaticShortField)(JNIEnv*, jclass, jfieldID, jshort);void(*SetStaticIntField)(JNIEnv*, jclass, jfieldID, jint);void(*SetStaticLongField)(JNIEnv*, jclass, jfieldID, jlong);void(*SetStaticFloatField)(JNIEnv*, jclass, jfieldID, jfloat);void(*SetStaticDoubleField)(JNIEnv*, jclass, jfieldID, jdouble);jstring(*NewString)(JNIEnv*, const jchar*, jsize);jsize(*GetStringLength)(JNIEnv*, jstring);const jchar* (*GetStringChars)(JNIEnv*, jstring, jboolean*);void(*ReleaseStringChars)(JNIEnv*, jstring, const jchar*);jstring(*NewStringUTF)(JNIEnv*, const char*);jsize(*GetStringUTFLength)(JNIEnv*, jstring);const jbyte* (*GetStringUTFChars)(JNIEnv*, jstring, jbool*);void(*ReleaseStringUTFChars)(JNIEnv*, jstring, const jbyte*);jsize(*GetArrayLength)(JNIEnv*, jarray);jarray(*NewObjectArray)(JNIEnv*, jsize, jclass, jobject);jobject(*GetObjectArrayElement)(JNIEnv*, jarray, jsize);void(*SetObjectArrayElement)(JNIEnv*, jarray, jsize, jobject);jarray(*NewBooleanArray)(JNIEnv*, jsize);jarray(*NewByteArray)(JNIEnv*, jsize);jarray(*NewCharArray)(JNIEnv*, jsize);jarray(*NewShortArray)(JNIEnv*, jsize);jarray(*NewIntArray)(JNIEnv*, jsize);jarray(*NewLongArray)(JNIEnv*, jsize);jarray(*NewFloatArray)(JNIEnv*, jsize);jarray(*NewDoubleArray)(JNIEnv*, jsize);jbool*(*GetBooleanArrayElements)(JNIEnv*, jarray, jbool*);jbyte*(*GetByteArrayElements)(JNIEnv*, jarray, jbool*);jchar*(*GetCharArrayElements)(JNIEnv*, jarray, jbool*);jshort*(*GetShortArrayElements)(JNIEnv*, jarray, jbool*);jint*(*GetIntArrayElements)(JNIEnv*, jarray, jbool*);jlong*(*GetLongArrayElements)(JNIEnv*, jarray, jbool*);jfloat*(*GetFloatArrayElements)(JNIEnv*, jarray, jbool*);jdouble* (*GetDoubleArrayElements)(JNIEnv*, jarray, jbool*);void(*ReleaseBooleanArrayElements)(JNIEnv*, jarray, jbool*, jint);void(*ReleaseByteArrayElements)(JNIEnv*, jarray, jbyte*, jint);void(*ReleaseCharArrayElements)(JNIEnv*, jarray, jchar*, jint);void(*ReleaseShortArrayElements)(JNIEnv*, jarray, jshort*, jint);void(*ReleaseIntArrayElements)(JNIEnv*, jarray, jint*, jint);void(*ReleaseLongArrayElements)(JNIEnv*, jarray, jlong*, jint);void(*ReleaseFloatArrayElements)(JNIEnv*, jarray, jfloat*, jint);void(*ReleaseDoubleArrayElements)(JNIEnv*, jarray, jdouble*, jint);void(*GetBooleanArrayRegion)(JNIEnv*, jarray, jsize, jsize, jbool*);void(*GetByteArrayRegion)(JNIEnv*, jarray, jsize, jsize, jbyte*);void(*GetCharArrayRegion)(JNIEnv*, jarray, jsize, jsize, jchar*);void(*GetShortArrayRegion)(JNIEnv*, jarray, jsize, jsize, jshort*);void(*GetIntArrayRegion)(JNIEnv*, jarray, jsize, jsize, jint*);void(*GetLongArrayRegion)(JNIEnv*, jarray, jsize, jsize, jlong*);void(*GetFloatArrayRegion)(JNIEnv*, jarray, jsize, jsize, jfloat*);void(*GetDoubleArrayRegion)(JNIEnv*, jarray, jsize, jsize, jdouble*);void(*SetBooleanArrayRegion)(JNIEnv*, jarray, jsize, jsize, jbool*);void(*SetByteArrayRegion)(JNIEnv*, jarray, jsize, jsize, jbyte*);void(*SetCharArrayRegion)(JNIEnv*, jarray, jsize, jsize, jchar*);void(*SetShortArrayRegion)(JNIEnv*, jarray, jsize, jsize, jshort*);void(*SetIntArrayRegion)(JNIEnv*, jarray, jsize, jsize, jint*);void(*SetLongArrayRegion)(JNIEnv*, jarray, jsize, jsize, jlong*);void(*SetFloatArrayRegion)(JNIEnv*, jarray, jsize, jsize, jfloat*);void(*SetDoubleArrayRegion)(JNIEnv*, jarray, jsize, jsize, jdouble*);jint(*RegisterNatives)(JNIEnv*, jclass, const JNINativeMethod*, jint);jint(*UnregisterNatives)(JNIEnv*, jclass);jint(*MonitorEnter)(JNIEnv*, jobject);jint(*MonitorExit)(JNIEnv*, jobject);jint(*GetJavaVM)(JNIEnv*, JavaVM**);};
0 0
原创粉丝点击