JNI 方法 CallObjectMethod、CallObjectMethodV 和 CallObjectMethodA 的区别是什么?

anq*_*nql 1 c++ java java-native-interface

JNI CallObjectMethod中有3种方法 CallObjectMethodV CallObjectMethodA 那么这些方法有什么区别呢?

jobject     (*CallObjectMethod)(JNIEnv*, jobject, jmethodID, ...);
jobject     (*CallObjectMethodV)(JNIEnv*, jobject, jmethodID, va_list);
jobject     (*CallObjectMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
Run Code Online (Sandbox Code Playgroud)

Ser*_*gio 6

唯一的区别是 java 参数的传递方式。文档很好地解释了这一切:

调用<类型>方法例程

程序员将所有要传递给方法的参数紧跟在 methodID 参数之后。CallMethod 例程接受这些参数并将它们传递给程序员希望调用的 Java 方法。

调用<type>MethodA 例程

程序员将方法的所有参数放在紧跟在 methodID 参数之后的 jvalue 的 args 数组中。CallMethodA 例程接受该数组中的参数,然后将它们传递给程序员希望调用的 Java 方法。

调用<类型>MethodV 例程

程序员将方法的所有参数放在 va_list 类型的 args 参数中,该参数紧跟在 methodID 参数之后。CallMethodV 例程接受参数,然后将它们传递给程序员希望调用的 Java 方法。