前言

jni中除了基本数据类型和数组之外,都是jobject类型的变量。jni提供了一系列的方法来操作jobject。 
下面的示例都是根据TestObject.java来进行的。

public class TestObject {private String firstName;private String secondName;public TestObject(String firstName, String secondName) {this.firstName = firstName;this.secondName = secondName;}public String getResult() {return String.format("%1$s-=-%2$s", firstName, secondName);}
}

判断对象类型

IsInstanceOf(env, jobj, jclass)可以用来判断jobject是否是某个jclass类型。

jclass jTestObject = (*env)->FindClass(env, "com/mislead/testjni/TestObject");if(jTestObject==NULL)
{LOGE("cannot found class:com/mislead/testjni/TestObject");return NULL;
}if((*env)->IsInstanceOf(env, obj, jTestObject))
{}

调用对象方法

  • GetObjectMethodID(env, jclass, methodName, signature)获取到方法id。
  • CallObjectMethod(env, jobject, methodID)来调用方法,或者获取结果。
// getResult() method
// first get method id by GetMethodID(JNIEnv, jclass, methodName, methodSignature)
jmethodID jmID=(*env)->GetMethodID(env, jTestObject, "getResult", "()Ljava/lang/String;");
// call method
return (*env)->CallObjectMethod(env, obj, jmID);

关于Signature

如果细心会发现我们在生成的jni头文件,函数前的注释部分都有Signature,你可以参考写法。下面是一些说明: 
方法的Signature是由方法的参数和返回值的类型共同构成的,下面是他们的结构: 
“(argument-types)return-type” 
其中Java程序中参数类型和其对应的值如下:

Signature  Java中的类型 
Z       boolean 
B       byte 
C       char 
S       short 
I        int 
J        long 
F       float 
D       double 
L fully-qualified-class;   fully-qualified-class 
   
[ type  type[] 
   
( arg-types ) ret-type  method type

一个Java类的方法的Signature可以通过javap命令获取: 
javap -s -p Java类名

生成一个对象

  • FindClass(env, className)得到想要的jclass。
  • GetObjectMethodID(env, jclass, "<init>", signature)获取到构造方法的ID。类的构造方法名字统一为<init>,默认无参数的signature为()V
/** Class:     com_mislead_testjni_TestJni* Method:    testCreateObject* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;*/JNIEXPORT jstring JNICALL Java_com_mislead_testjni_TestJni_testCreateObject(JNIEnv *env, jobject jobj, jstring first, jstring second)
{//first, create a TestObjectjclass jTestObject = (*env)->FindClass(env, "com/mislead/testjni/TestObject");// get construct method idjmethodID construct = (*env)->GetMethodID(env, jTestObject, "<init>", "(Ljava/lang/String;Ljava/lang/String;)V");jobject obj=(*env)->NewObject(env, jTestObject, construct, first, second);return callGetResult(env, obj);
}

获取对象的属性

  • GetObjectFieldID(env, jclass, fieldName, signature)获取fieldID。
  • GetObjectField(env, jobject, fieldID)获取到属性值。
jclass jcls=(*env)->GetObjectClass(env, obj);jfieldID fid=(*env)->GetFieldID(env, jcls, "firstName", "Ljava/lang/String;");jstring firstName=(*env)->GetObjectField(env, obj, fid);

静态方法和属性

调用静态方法:   
就是将第二步和第三步调用的方法改为对应的: 
GetStaticMethodID获取对应的静态方法的ID 
CallStaticIntMethod调用静态方法 
获取静态属性: 
使用GetStaticFieldID>

jni-jobject操作对象相关推荐

  1. android jni 调用java对象_Android NDK开发之Jni调用Java对象

    本地代码中使用Java对象 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instance)的域,调用静态(static)和实例(instance)函 ...

  2. 一起谈.NET技术,VS2010测试功能之旅:编码的UI测试(3)-操作对象的识别原理...

    回顾  在之前的两章分别介绍了一个简单的示例, 操作动作的录制原理,通过修改UIMap.UItest文件控制操作动作代码的生成.想必大家对编码的UI测试操作动作的录制应该有一定了解了,在UI操作中,操 ...

  3. JavaScript学习笔记——underscore操作对象的方法

    var obj = {a:'aaa',b:'bbb',c:'ccc'}; 1._.keys(obj)获取对象的所有属性名称 2._.values(obj)获取对象的所有属性值 3._.extend(d ...

  4. java 反射创建对象并赋值_java使用反射创建并操作对象的方法

    Class 对象可以获得该类里的方法(由 Method 对象表示).构造器(由 Constructor 对象表示).成员变量(由 Field 对象表示),这三个类都位于 java.lang.refle ...

  5. JS-面向对象-操作对象的属性 / 检测对象的某个属性是否存在 / 遍历(枚举)对象的属性 / 属性的分类

    操作对象的属性 <!DOCTYPE html> <html lang="en"> <head><meta charset="UT ...

  6. Java通过引用操作对象的“共享”特性

    先来理解一下引用和对象的关系:对于任何引用类型直接创建的变量都是一个引用,这个引用指向这个类型的对象,数据是存在对象中的,对数据的操作实质是通过引用找到对应的对象,在对对象中的数据进行操作. 而题目中 ...

  7. 导航属性没有被赋值_excel编程系列基础:操作对象RANDE的属性介绍

    编按: 哈喽,大家好!在上篇的VBA文章中,我们提到了RANGE属性,简单介绍了它在选中单元格区域,以及对单元格区域赋值时的作用,但这仅仅是最基础的应用,今天我们继续来讲解RANGE属性. [前言] ...

  8. [python + debug] set()操作对象的元素为字符串,则结果随机排序,使用sorted()函数以固定顺序

    文章目录 问题描述 原因分析 解决方式 问题描述 当我对数据集的字符串类型的label进行编码时,要使用set()函数来提取出所有类别的标签. 这样做的结果是,我发现每次画出来的图,每次样本点的颜色都 ...

  9. ES6-用Proxy和Reflect操作对象

    ES中,新增了Proxy和Reflect两个内置对象,并且经常结合起来使用,我个人觉得先理解了Reflect对象,Proxy就更好理解了. 一.Reflect对象 Reflect 是ECMAScrip ...

  10. JavaScript常用的字符串操作对象方法

    文章目录 ==对象方法== ++搜索.索引 `indexOf() ` :搜索首个字符串出现的位置 `lastIndexOf() `:搜索最后出现的字符串位置 `includes() `:搜索判断字符串 ...

最新文章

  1. 集生态之力跨城市数字化之难题,英特尔交上了一份完美答卷
  2. @RequestBody映射
  3. Go语言中如何进行测试
  4. java中的可检查和不检查_检查Java测试中发生了什么
  5. Oracle 18c 新特性:动态 Container Map 增强 Application Container 灵活性
  6. 自己动手、丰衣足食!面试表
  7. inDesign教程,如何创建、修改和使用母版页?
  8. 创建项目连接错误_在不同项目下S7-1200主站模块和 S7-300 CP342-5通信的实现方法...
  9. MVC设计模式:概念,模型,视图,控制器
  10. mac 提示缺失Myriad字体
  11. Matlab实现均值滤波
  12. 在线教育公司的硬件雄心:1秒查词,网易有道发布词典笔二代
  13. 求1到n的所有质数(素数)
  14. 木兰编程语言,当事人最新回复来了
  15. vivo 应用商店推荐系统探索与实践
  16. Python 弹出对话输入框
  17. SpringBoot添加压力测试
  18. 常见的服务器操作系统和工作站操作系统
  19. 计量经济学及Stata应用 第七章 异方差
  20. 【Spire.Doc】合并 Word 文档,将多个文档合并为一个

热门文章

  1. 嵌入式操作系统漫议:功能与特点
  2. PHP 使用ImageMagic正片叠底
  3. 飞信免费消息api,飞信接口
  4. Java8:永久代(PermGen)和元空间(Metaspace)
  5. 被围剿的“极兔”:跳墙去海外市场,但能成为“UPS”吗?
  6. Spring 使用详解
  7. 创龙Xilinx Zynq-7000系列SoC高性能处理器开发板的CameraLink接口、Watchdog接口
  8. phpstorm破解
  9. 工厂人员定位系统源码,支持智能考勤、工时统计、行为检测、历史轨迹回放、人员管理、电子围栏功能
  10. DateDiff的用法(asp时间比较函数)