Android JNI 学习(八):JNI 接口整理 — Calling Instance Methods Api
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Android JNI 学习(八):JNI 接口整理 — Calling Instance Methods Api,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5260字,纯文字阅读大概需要8分钟。
内容图文
一、GetMethodID
jmethodIDGetMethodID(JNIEnv *env, jclass clazz, constchar *name, constchar *sig);
返回类或接口实例(非静态)方法的方法 ID。方法可在某个 clazz
的超类中定义,也可从 clazz
继承。该方法由其名称和签名决定。
GetMethodID()
可使未初始化的类初始化。
要获得构造函数的方法 ID,应将 <init>
作为方法名,同时将 void
(V
) 作为返回类型。
参数:
env:JNI 接口指针。
clazz
:Java 类对象。
name
:0 终结的 UTF-8 字符串中的方法名。
sig
:0 终结的 UTF-8 字符串中的方法签名。
返回值:
方法 ID,如果找不到指定的方法,则为 NULL
。
抛出:
NoSuchMethodError:如果找不到指定方法。
ExceptionInInitializerError
:如果由于异常而导致类初始化程序失败。
OutOfMemoryError
:如果系统内存不足。
二、Call<type>Method Routines、Call<type>MethodA Routines、Call<type>MethodV Routines
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);
这三个操作的方法用于从本地方法调用Java 实例方法。它们的差别仅在于向其所调用的方法传递参数时所用的机制。
这三个操作将根据所指定的方法 ID 调用 Java 对象的实例(非静态)方法。
参数 methodID
必须通过调用 GetMethodID()
来获得。
当这些函数用于调用私有方法和构造函数时,方法 ID 必须从 obj
的真实类派生而来,而不应从其某个超类派生。
Call<type>Method Routines
编程人员应将要传给方法的所有参数紧跟着放在 methodID
参数之后。Call<type>Method routine 接受这些参数并将其传给编程人员所要调用的 Java 方法。
Call<type>MethodA Routines
编程人员应将要传给方法的所有参数放在紧跟在 methodID
参数之后的 jvalues
类型数组 args 中。Call<type>MethodA routine 接受这些数组中的参数并将其传给编程人员所要调用的 Java 方法。
Call<type>MethodV Routines
编程人员将方法的所有参数放在紧跟着在 methodID
参数之后的 va_list
类型参数变量中。Call<type>MethodV routine 接受这些参数并将其传给编程人员所要调用的 Java 方法。
下表根据结果类型说明了各个方法调用例程。用户应将Call<type>Method 中的 type 替换为所调用方法的 Java 类型(或使用表中的实际方法调用例程名),同时将 NativeType 替换为该例程相应的本地类型。
Call<type>Method Routines 名 |
|
|
|
参数:
env:JNI 接口指针。
obj
:Java 对象。
methodID
:方法 ID。
Call<type>Method Routines的其它参数:
要传给 Java 方法的参数。
Call<type>MethodA Routines的其它参数:
args:参数数组。
Call<type>MethodV Routines的其它参数:
args:参数的 va_list。
返回值:
返回调用 Java 方法的结果。
抛出:
执行 Java 方法时抛出的异常。
三、CallNonvirtual<type>Method Routines、CallNonvirtual<type>MethodA Routines、CallNonvirtual<type>MethodV Routines
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 例程则根据获得方法 ID 的(由 clazz
参数指定)类调用方法。方法 ID 必须从对象的真实类或其某个超类获得。
CallNonvirtual<type>Method Routines
编程人员应将要传给方法的所有参数紧跟着放在 methodID
参数之后。CallNonvirtual<type>Method routine 接受这些参数并将其传给编程人员所要调用的 Java 方法。
CallNonvirtual<type>MethodA Routines
编程人员应将要传给方法的所有参数放在紧跟在 methodID
参数之后的 jvalues
类型数组 args 中。CallNonvirtual<type>MethodAroutine 接受这些数组中的参数并将其传给编程人员所要调用的 Java 方法。
CallNonvirtual<type>MethodV Routines
编程人员应将要传给方法的所有参数放在紧跟在 methodID
参数之后的 va_list
类型参数 args 中。CallNonvirtualMethodV routine 接受这些参数并将其传给编程人员所要调用的 Java 方法。
下表根据结果类型说明了各个方法调用例程。用户应将CallNonvirtual<type>Method 中的 type 替换为所调用方法的 Java 类型(或使用表中的实际方法调用例程名),同时将 NativeType 替换为该例程相应的本地类型。
参数:
env:JNI 接口指针。
clazz:
Java 类。
obj
: Java 对象。
methodID
:方法 ID。
CallNonvirtual<type>Method Routines的其它参数:
要传给 Java 方法的参数。
CallNonvirtual<type>MethodA Routines的其它参数:
args:参数数组。
CallNonvirtual<type>MethodV Routines的其它参数:
args:参数的 va_list
。
返回值:
调用 Java 方法的结果。
抛出:
执行 Java 方法时所抛出的异常。
原文:https://www.cnblogs.com/renhui/p/9986164.html
内容总结
以上是互联网集市为您收集整理的Android JNI 学习(八):JNI 接口整理 — Calling Instance Methods Api全部内容,希望文章能够帮你解决Android JNI 学习(八):JNI 接口整理 — Calling Instance Methods Api所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。