一、GetMethodID

jmethodIDGetMethodID(JNIEnv *env, jclass clazz, const char *name, const char *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 名

本地类型

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 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 替换为该例程相应的本地类型。

CallNonvirtual<type>Method Routines名

本地类型

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 Routines的其它参数:

要传给 Java 方法的参数。

CallNonvirtual<type>MethodA Routines的其它参数:

args:参数数组。

CallNonvirtual<type>MethodV Routines的其它参数:

args:参数的 va_list

返回值:

调用 Java 方法的结果。

抛出:

执行 Java 方法时所抛出的异常。

Android JNI 学习(八):Calling Instance Methods Api的更多相关文章

  1. Android JNI 学习(九):Static Fields Api & Static Methods Api

    一.Accessing Static Fields(访问静态域) 1. GetStaticFieldID jfieldIDGetStaticFieldID(JNIEnv *env, jclass cl ...

  2. Android JNI 学习(十):String Operations Api & Other Apis

    一.String Operations(字符串操作) 1. NewString jstring NewString(JNIEnv *env, const jchar *unicodeChars, js ...

  3. Android JNI 学习(七):Accessing Fields Api

    一.GetFieldID jfieldIDGetFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig); 返回类的实 ...

  4. Android JNI 学习(六):Object Operations Api

    一.AllocObject jobjectAllocObject(JNIEnv *env, jclass clazz); 分配新 Java 对象而不调用该对象的任何构造函数.返回该对象的引用. cla ...

  5. Android JNI学习(四)——JNI的常用方法的中文API

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  6. Android JNI学习(二)——实战JNI之“hello world”

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  7. Android JNI学习(五)——Demo演示

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  8. Android JNI学习(三)——Java与Native相互调用

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  9. Android JNI 学习(一):JNI 简介

    JNI 即 Java Native Interface 是 native 编程接口,它允许在Java虚拟机(VM)内运行Java代码与其他编程语言(主要是C和C++)编写的应用程序和库进行交互操作. ...

随机推荐

  1. 对象属性拷贝工具类大全==>Bean的属性拷贝从此不用愁

    大家在做java开发时,肯定会遇到api层参数对象传递给服务层,或者把service层的对象传递给dao层,他们之间又不是同一个类型对象,但字段又是一样,如果还是用普通的get.set方式来处理话,比 ...

  2. vue动态绑定background:url绑不上的问题

    场景: 利用swipper做轮播图,在联调的时候发现有些图片存在有些图片不存在 原因:图片路径中存在 (),和 background:url() 会冲突 解决方法: 一:oss图片路径避免出现括号 ( ...

  3. EL表达式、JSTL标签库

    一.EL(Expression Language)表达式 语法结构:${var} 若要停用对EL表达式的评估的话,需要使用page指令将isELIgnored属性值设为true: <%@ pag ...

  4. Posche Piwis 3 Original and Clone – What’s the difference

    Category : Car Diagnostic Tools What’s the difference between Porsche Tester Piwis III original and ...

  5. OO第一单元单元总结

    总述 三周的时间一晃而过,也到了和表达式说再见的时候了.想起来,现在已经能够优雅地在互测“攻击”别人,然后笑对被别人“攻击”,就觉得OO这三周还是很有意义,也多多少少改变了我.周六已经快习惯早上背着包 ...

  6. java31

    1.包装类 基本数据类型包装成对象,使基本数据类型的功能更加强大, 基本数据类型 包装类 byte Byte short Short int Integer long Long float Float ...

  7. Finish final project

    一.项目地址:https://github.com/Joyce45/final-project 二.团队成员陈述: 于浩: 张雨: 遇到的问题:1.通过relativepanel解决了刚开始设计上使用 ...

  8. C重新入门

    推荐书籍:<C专家编程>.<C和指针>.<C陷阱与缺陷> <C专家编程>参看:http://www.ituring.com.cn/article/274 ...

  9. python文件操作打开模式 r,w,a,r+,w+,a+ 区别辨析

    主要分成三大类: r 和 r+     "读"功能 r  只读 r+ 读写(先读后写) 辨析:对于r,只有读取功能,利用光标的移动,可以选择要读取的内容. 对于r+,同时具有读和写 ...

  10. 今天我给你们推荐一本书《Linux就该这么学》!!!

    本书是由全国多名红帽架构师(RHCA)基于最新Linux系统共同编写的高质量Linux技术自学教程,极其适合用于Linux技术入门教程或讲课辅助教材,目前是国内最值得去读的Linux教材,也是最有价值 ...