a284628487 / JniSample

0 stars 0 forks source link

类操作&对象操作 #2

Open a284628487 opened 6 years ago

a284628487 commented 6 years ago

类操作

DefineClass

从原始类数据的缓冲区中加载类。

jclass DefineClass(const char *name, jobject loader, const jbyte* buf, jsize bufLen)

返回值:返回Java类对象。如果出错则返回NULL。 抛出:ClassFormatError:如果类数据指定的类无效。ClassCircularityError:如果类或接口是自身的超类或超接口。OutOfMemoryError:如果系统内存不足。

FindClass

加载本地定义的类。它将搜索由CLASSPATH环境变量为具有指定名称的类所指定的目录和zip文件。

jclass FindClass(JNIEnv *env, const char *name);

GetSuperclass

如果clazz代表类而非类object,则该函数返回由clazz所指定的类的超类。如果clazz指定类object或代表某个接口,则该函数返回NULL。

jclass GetSuperclass(JNIEnv *env, jclass clazz);

IsAssignableFrom

确定clazz1的对象是否可安全地强制转换为clazz2。

jboolean IsAssignableFrom(JNIEnv *env, jclass clazz1, jclass clazz2);

全局或局部引用

NewGlobalRef

创建obj参数所引用对象的新全局引用。obj参数既可以是全局引用,也可以是局部引用。全局引用通过调用DeleteGlobalRef()来显式撤消。

jobject NewGlobalRef(JNIEnv *env, jobject obj);

DeleteGlobalRef

删除globalRef所指向的全局引用。

void DeleteGlobalRef(JNIEnv *env, jobject globalRef);

DeleteLocalRef

删除localRef所指向的局部引用。

void DeleteLocalRef(JNIEnv *env, jobject localRef);

对象操作

AllocObject

分配新Java对象而不调用该对象的任何构造函数。返回该对象的引用。clazz参数务必不要引用数组类。

jobject AllocObject(JNIEnv *env, jclass clazz);

NewObject NewObjectA NewObjectV

jobject NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...);
jobject NewObjectA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
jobject NewObjectV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);

NewObjectA#args,将所有参数放到jvalue类型的数组当中。 NewObjectV#args,将所有参数放到va_list类型的参数当中。

GetObjectClass

返回对象的类。

jclass GetObjectClass(JNIEnv *env, jobject obj);

IsInstanceOf

测试对象是否为某个类的实例。

jboolean IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz);

IsSameObject

测试两个引用是否引用同一Java对象。

jboolean IsSameObject(JNIEnv *env, jobject ref1, jobject ref2);

读&写 Field

GetFieldID

返回类的实例对象的字段ID。该字段由其名称及签名指定。访问器函数的GetField及SetField系列使用域ID检索对象域。 GetFieldID()将未初始化的类初始化。

jfieldID GetFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig);

GetFieldID()不能用于获取数组的长度属性。应使用GetArrayLength()

GetTypeField

NativeType Get<type>Field(JNIEnv *env, jobject obj, jfieldID fieldID);

SettypeField

void Set<type>Field(JNIEnv *env, jobject obj, jfieldID fieldID, NativeType value);

调用Method

GetMethodID

jmethodID GetMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig);

返回类或接口实例(非静态)方法的方法ID。方法可在某个clazz的超类中定义,也可从clazz继承。该方法由其名称和签名决定。GetMethodID()可使未初始化的类初始化。要获得构造函数的方法ID,应将作为方法名,同时将void (V)作为返回类型。

CallMethod,CallMethodA,CallMethodV

从本地方法调用Java实例方法。它们的差别仅在于向其所调用的方法传递参数时所用的机制。这三个操作将根据所指定的方法ID 调用Java对象的实例(非静态)方法。参数methodID必须通过调用GetMethodID()来获得。

NativeType Call<type>Method(JNIEnv *env, jobject obj, jmethodID methodID, ...);
NativeType Call<type>MethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args);
NativeType Call<type>MethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args);

当这些函数用于调用私有方法和构造函数时,方法ID必须从obj的真实类派生而来,而不应从其某个超类派生。

    *CallMethod例程名*                                         返回类型     
    CallVoidMethod() CallVoidMethodA() CallVoidMethodV()        void     
    CallObjectMethod() CallObjectMethodA() CallObjectMethodV()      jobject  
    CallBooleanMethod() CallBooleanMethodA() CallBooleanMethodV()       jboolean     
    CallByteMethod() CallByteMethodA() CallByteMethodV()        jbyte    
    CallCharMethod() CallCharMethodA() CallCharMethodV()        jchar    
    CallShortMethod() CallShortMethodA() CallShortMethodV()     jshort   
    CallIntMethod() CallIntMethodA() CallIntMethodV()       jint     
    CallLongMethod() CallLongMethodA() CallLongMethodV()        jlong    
    CallFloatMethod() CallFloatMethodA() CallFloatMethodV()     jfloat   
    CallDoubleMethod() CallDoubleMethodA() CallDoubleMethodV()      jdouble  

CallNonvirtualMethod,CallNonvirtualMethodA,CallNonvirtualMethodV例程

根据指定的类和方法ID调用某Java对象的实例(非静态)方法。参数methodID必须通过调用clazz类的 GetMethodID()获得。CallNonvirtualMethodCallMethod并不相同。 CallMethod根据对象的实例调用方法,而CallNonvirtualMethod则根据获得方法ID的(由clazz参数指定)类调用方法。方法ID必须从对象的真实类或 其某个超类获得。

NativeType CallNonvirtual<type>Method(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
NativeType CallNonvirtual<type>MethodA(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
NativeType CallNonvirtual<type>MethodV(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
    *CallNonvirtualMethod例程名*                                                           返回类型     
    CallNonvirtualVoidMethod() CallNonvirtualVoidMethodA() CallNonvirtualVoidMethodV()      void     
    CallNonvirtualObjectMethod() CallNonvirtualObjectMethodA() CallNonvirtualObjectMethodV()        jobject  
    CallNonvirtualBooleanMethod() CallNonvirtualBooleanMethodA() CallNonvirtualBooleanMethodV()     jboolean     
    CallNonvirtualByteMethod() CallNonvirtualByteMethodA() CallNonvirtualByteMethodV()      jbyte    
    CallNonvirtualCharMethod() CallNonvirtualCharMethodA() CallNonvirtualCharMethodV()      jchar    
    CallNonvirtualShortMethod() CallNonvirtualShortMethodA() CallNonvirtualShortMethodV()       jshort   
    CallNonvirtualIntMethod() CallNonvirtualIntMethodA() CallNonvirtualIntMethodV()     jint     
    CallNonvirtualLongMethod() CallNonvirtualLongMethodA() CallNonvirtualLongMethodV()      jlong    
    CallNonvirtualFloatMethod() CallNonvirtualFloatMethodA() CallNonvirtualFloatMethodV()       jfloat   
    CallNonvirtualDoubleMethod() CallNonvirtualDoubleMethodA() CallNonvirtualDoubleMethodV()        jdouble  

访问静态字段

GetStaticFieldID

返回类的静态域的域ID。域由其名称和签名指定。GetStaticField和SetStaticField访问器函数系列使用域ID检索静态域。GetStaticFieldID()将未初始化的类初始化。

jfieldID GetStaticFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig);

GetStaticField

NativeType GetStatic<type>Field(JNIEnv *env, jclass clazz, jfieldID fieldID);
    *SetStaticField例程名*     本地类型     
    SetStaticObjectField()      jobject  
    SetStaticBooleanField()     jboolean     
    SetStaticByteField()        jbyte    
    SetStaticCharField()        jchar    
    SetStaticShortField()       jshort   
    SetStaticIntField()     jint     
    SetStaticLongField()        jlong    
    SetStaticFloatField()       jfloat   
    SetStaticDoubleField()      jdouble  

静态方法

GetStaticMethodID

返回类的静态方法的方法ID。方法由其名称和签名指定。GetStaticMethodID()将未初始化的类初始化。

jmethodID GetStaticMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig);

CallStaticMethod,CallStaticMethodA,CallStaticMethodV

这些操作将根据指定的方法ID调用Java对象的静态方法。methodID参数必须通过调用GetStaticMethodID()得到。方法ID必须从clazz派生,而不能从其超类派生。

NativeType CallStatic<type>Method(JNIEnv *env, jclass clazz, jmethodID methodID, ...);
NativeType CallStatic<type>MethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
NativeType CallStatic<type>MethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
    *CallStaticMethod例程名*       本地类型     
    CallStaticVoidMethod() CallStaticVoidMethodA() CallStaticVoidMethodV()      void     
    CallStaticObjectMethod() CallStaticObjectMethodA() CallStaticObjectMethodV()        jobject  
    CallStaticBooleanMethod() CallStaticBooleanMethodA() CallStaticBooleanMethodV()     jboolean     
    CallStaticByteMethod() CallStaticByteMethodA() CallStaticByteMethodV()      jbyte    
    CallStaticCharMethod() CallStaticCharMethodA() CallStaticCharMethodV()      jchar    
    CallStaticShortMethod() CallStaticShortMethodA() CallStaticShortMethodV()       jshort   
    CallStaticIntMethod() CallStaticIntMethodA() CallStaticIntMethodV()     jint     
    CallStaticLongMethod() CallStaticLongMethodA() CallStaticLongMethodV()      jlong    
    CallStaticFloatMethod() CallStaticFloatMethodA() CallStaticFloatMethodV()       jfloat   
    CallStaticDoubleMethod() CallStaticDoubleMethodA() CallStaticDoubleMethodV()        jdouble