龙空技术网

JNI函数系列 - 调用实例方法

睿智的海边风浪 56

前言:

现时小伙伴们对“java实例方法类方法”大体比较关心,大家都想要剖析一些“java实例方法类方法”的相关知识。那么小编同时在网络上汇集了一些对于“java实例方法类方法””的相关资讯,希望姐妹们能喜欢,咱们快快来了解一下吧!

调用实例方法GetMethodID

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

返回一个类或接口的实例(非静态)方法的方法ID。该方法可以在clazz的超类中定义并由clazz继承。方法通过其名称和签名确定。

GetMethodID()会导致一个未初始化的类被初始化。

要获取构造函数的方法ID,请将<init>作为方法名称,并将void(V)作为返回类型。

链接:

JNIEnv接口函数表中的索引为33。

参数:

env:JNI接口指针。clazz:一个Java类对象。name:一个以0结尾的修饰过的UTF-8字符串,表示方法名称。sig:一个以0结尾的修饰过的UTF-8字符串,表示方法签名。

返回:

返回一个方法ID,如果无法找到指定的方法,则返回NULL。

抛出:

NoSuchMethodError:如果找不到指定的方法。ExceptionInInitializerError:如果类初始化程序因异常而失败。OutOfMemoryError:如果系统内存不足。Call<type>Method、Call<type>MethodA、Call<type>MethodV方法

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

这三种操作系列的方法用于从 native 方法调用Java实例方法。它们的区别在于它们传递参数给它们调用的方法的机制。

这些操作系列会根据指定的方法ID在Java对象上调用一个实例(非静态)方法。方法ID参数必须通过调用GetMethodID()获得。

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

Call<type>Method方法

程序员将要传递给该方法的所有参数直接放在方法ID参数之后。Call<type>Method方法接受这些参数并将它们传递给程序员希望调用的Java方法。

Call<type>MethodA方法

程序员将所有要传递给方法的参数放在一个紧随methodID参数之后的jvalues数组中。Call<type>MethodA方法接受该数组中的参数,并将它们传递给程序员希望调用的Java方法。

Call<type>MethodV方法

程序员将所有要传递给方法的参数放在一个类型为va_list的args参数中,该参数紧随methodID参数之后。Call<type>MethodV方法接受这些参数,并将它们传递给程序员希望调用的Java方法。

下表描述了每个方法调用例程按其结果类型。您应该将Call<type>Method中的type替换为要调用的方法的Java类型(或使用表中的实际方法调用例程名称),并将NativeType替换为该例程的相应本机类型。

实例方法调用例程

Call<type>Method 方法名

native 类型

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

参数:

env:JNI接口指针。obj:一个Java对象。methodID:一个方法ID。

Call<type>Method方法的附加参数:

要传递给Java方法的参数。

Call<type>MethodA方法的附加参数:

args:参数数组。

Call<type>MethodV方法的附加参数:

args:参数的va_list。

返回:

返回调用Java方法的结果。

抛出:

在执行Java方法期间引发的异常。CallNonvirtual<type>Method 方法、CallNonvirtual<type>MethodA 方法、CallNonvirtual<type>MethodV 方法

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

这些操作系列的方法根据指定的类和方法ID在Java对象上调用一个实例(非静态)方法。methodID参数必须通过在类clazz上调用GetMethodID()来获取。

CallNonvirtual<type>Method例程和Call<type>Method例程是不同的。Call<type>Method例程基于对象的类调用方法,而CallNonvirtual<type>Method例程基于由clazz参数指定的类调用方法,该类是从中获取方法ID的。方法ID必须从对象的实际类或其超类之一中获取。

CallNonvirtual<type>Method方法

程序员将要传递给该方法的所有参数直接放在methodID参数之后。CallNonvirtual<type>Method例程接受这些参数并将它们传递给程序员希望调用的Java方法。

CallNonvirtual<type>MethodA方法

程序员将要传递给该方法的所有参数放在紧随methodID参数之后的jvalues类型的args数组中。CallNonvirtual<type>MethodA例程接受此数组中的参数,并将其传递给程序员希望调用的Java方法。

CallNonvirtual<type>MethodV方法

程序员将要传递给该方法的所有参数放在类型为va_list的args参数中,该参数紧随methodID参数之后。CallNonvirtualMethodV例程接受这些参数,并将其传递给程序员希望调用的Java方法。

下表描述了每个方法调用例程及其结果类型。您应该将CallNonvirtual<type>Method中的type替换为该方法的Java类型,或使用表中的实际方法调用例程名称,并将NativeType替换为该例程的相应本机类型。

CallNonvirtual<type>Method

CallNonvirtual<type>Method 名称

Native Type

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

参数:

env:JNI接口指针。clazz:一个Java类。obj:一个Java对象。methodID:一个方法ID。

CallNonvirtual<type>Method方法的附加参数:

要传递给Java方法的参数。

CallNonvirtual<type>MethodA方法的附加参数:

args:参数数组。

CallNonvirtual<type>MethodV方法的附加参数:

args:参数的va_list。

返回:

返回调用Java方法的结果。

抛出:

在执行Java方法期间引发的异常。

标签: #java实例方法类方法 #java调用类中的函数 #java调用函数怎么调用