JNI函数的实现在c/c++中实现的,如果想访问java中定义的类对象的实例域需要三个步骤

1.通过GetObjectClass()函数获得该对象的类class,返回值是一个jclass;
2.调用GetFieldID函数得到需要访问的实例域(变量)在该c类中id
3.调用Get【Type】Field()得到访问的变量值。其中【Type】对应变量的类型。
例如:java中有一个int age 对应的【Type】就是Int

GetIntField()

实例1:访问java类中num属性,并对其做加法运算。

java 层:

public class JNIUtils {public int num = 10;public native int addNum();static {System.loadLibrary("native-lib");}
}

c++层:

#include <jni.h>
#include <string.h>
#include <stdio.h>//访问java对象中num属性,并对其作加法运算
extern "C"
jint Java_com_honjane_ndkdemo_JNIUtils_addNum( JNIEnv* env, jobject jobj){//1.获得实例对应的class类jclass jcls = env->GetObjectClass(jobj);//2.通过class类找到对应的field id//num 为java类中变量名,I 为变量的类型intjfieldID fid = env->GetFieldID(jcls,"num","I");//3.通过实例object获得对应的fieldjint jnum = env->GetIntField(jobj,fid);//addjnum += 10;return jnum;
}

输出结果:

I/main----addNum: 20

实例2:访问java层static属性,并对其操作

java层:

public static String name = "honjane";public native void accessStaticField();

定义一个static的变量,然后在c++获取这个变量,对其操作,通过getStaticField返回到java显示。

c++层:


//访问java中静态变量name,并对其赋值
extern "C"
void Java_com_honjane_ndkdemo_JNIUtils_accessStaticField( JNIEnv* env, jobject jobj){//1.获得实例对应的class类jclass jcls = env->GetObjectClass(jobj);//2.通过class类找到对应的静态field id//name 为java类中变量名,Ljava/lang/String; 为变量的类型StringjfieldID fid = env->GetStaticFieldID(jcls,"name","Ljava/lang/String;");//3.通过class获得对应的静态fieldjstring jstr = (jstring)env->GetStaticObjectField(jcls,fid);// 将jstring类型转换成字符指针const char* cstr = env->GetStringUTFChars(jstr, JNI_FALSE);//定义字符数组char text[30] = "hello ";//拼接字符strcat(text, cstr);jstring new_str = env->NewStringUTF(text);// 将jstring类型的变量 , 设置到java env->SetStaticObjectField(jcls, fid, new_str);
}

输出结果:

I/main----name: hello honjane

这里有几个地方需要注意:
static变量的Field是通过GetStatic【[Type】Field(jcls…),传入的是class,而非static变量获取是通过Get【Type】Field(jobj…)传入的参数是实例object;同理SetStatic【[Type】Field(jcls…)传入的是类class,Set【Type】Field(jobj…)传入的是实例object。

这个也很好理解,静态变量或者方法属于该对象的类class,而非静态变量或方法属于该对象的实例。所以要根据它属于的情况来传参数。

实例3:访问java对象的私有变量

java层

private int age = 21;public native void accessPrivateField();public int getAge(){return age;}

c++层

//访问java中私有变量age
extern "C"
void Java_com_honjane_ndkdemo_JNIUtils_accessPrivateField( JNIEnv* env, jobject jobj){jclass jcls = env->GetObjectClass(jobj);jfieldID jfid = env->GetFieldID(jcls,"age","I");jint jage = env->GetIntField(jobj, jfid);jage++;env->SetIntField(jobj, jfid, jage);
}

输出结果:

I/main----age修改前: 21
I/main----age修改后: 22

我们看到实例3中private变量与实例1中public变量访问在c/c++没有什么区别,访问方式相同。

变量的访问先介绍到这里,下一节介绍jni访问java中方法

源码:https://github.com/honjane/JNIDemo

[JNI]开发之旅(6)JNI函数中访问java类中对象的属性相关推荐

  1. JSP中调用java类中的方法

    JSP中调用java类中的方法 1.新建一个项目,在src文件夹下添加一个包:如:test 2.再在包中添加一个类:如 package test; public class conDatabase { ...

  2. c语言里 如何取得线程的lpparameter'参数,请问线程函数如何访问对话框类中的变量...

    我线程函数定义在对话框类的实现文件中 需要访问对话框类头文件中声明的变量 怎么才可以? i_noname(晚九朝五) 于 2005-9-15 16:14:25 DWORD WINAPI Proc(LP ...

  3. SpringBoot中使用常量类来判断对象某属性的值是否包含在指定集合中

    场景 在业务场景中需要判断某对象类的属性值是否是指定的集中. 为了使用方便,可以指定的几种放在一个公共模块下的常量类. 注: 博客: https://blog.csdn.net/badao_liuma ...

  4. C++_类和对象_对象特性_友元_全局函数做友元_在类中声明友元权限的全局函数来访问_类中的private权限的变量---C++语言工作笔记052

    然后我们再来看友元,友元,其实就类似于, 比如一个建筑类,这里面有,客厅有卧室, 那么客厅是public的,大家都能访问,但是卧室是private的,外人不能访问 但是,如果是我的朋友,.我想让他访问 ...

  5. mybatis的mapper.xml中使用java类中的全局变量

    select * from demo where status = '${@cn.jichi.Global@zz}'

  6. jni java共享变量_JNI/NDK开发指南(七)——C/C++访问Java实例变量和静态变量 .

    在上一章中我们学习到了如何在本地代码中访问任意Java类中的静态方法和实例方法,本章我们也通过一个示例来学习Java中的实例变量和静态变量,在本地代码中如何来访问和修改.静态变量也称为类变量(属性), ...

  7. Oracle数据库中调用Java类开发存储过程、函数的方法

    Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...

  8. C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)

    C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...

  9. frida hook java 函数_使用 Frida 来 Hook Java 类中的构造函数(构造函数带重载),获取解密后的js脚本...

    一个APP使用了Auto.js 的加密脚本.我们的任务是将其加密脚本进行解密并dump出来.在  https://www.52pojie.cn/thread-1112407-1-1.html 一文中, ...

  10. 小程序 | 小程序中常用的事件 + 事件对象的属性列表 +小程序事件传参 + 小程序全局配置 + 小程序页面配置 + 小程序发起网络数据请求

    文章目录 一.WXML 模板语法 数据绑定 事件绑定 ⭐小程序中常用的事件 ⭐事件对象的属性列表 target 和 currentTarget 的区别 bindtap 的语法格式 在事件处理函数中为 ...

最新文章

  1. Python3中PyMongo使用举例
  2. winfrom gridview 导出到Excel文件的代码
  3. HDUOJ 1060 Leftmost Digit
  4. TypeScript 素描 - 函数
  5. java链表代码,java链表的基本使用 代码
  6. 《leetcode》longest-substring-without-repeating
  7. django中的form.is_valid()总是返回False
  8. 8.4. su - root
  9. Java基础拾遗:线程相关问题
  10. SQL Server 日志数据库清理办法
  11. Illustrator 教程,如何在 Illustrator 中描摹对象?
  12. SpringCloud系列第09节之消息总线Bus
  13. 易语言 自动更新替换自身 的方法
  14. 常见java异常英语词汇(一)
  15. Redission锁自动续期设置
  16. 计算机卡登录界面,win10电脑卡在登录界面怎么办
  17. 多台电脑共享上网的方法:在Windows XP中设置Internet连接共享
  18. 路由跳转时的页面状态保存
  19. p2p网络测试工具_DHT之路丨大规模网络测试的全新工具!
  20. excel成本统计:如何进行区域筛选,多条件求和?

热门文章

  1. 【 Codeforces Round #551 (Div. 2) D】Serval and Rooted Tree【树形DP】
  2. 【POJ 1456】Supermarket【两种做法】【二叉堆贪心】【并查集】
  3. 常系数齐次线性微分方程的解法
  4. 脏读、不可重复读与幻读和spring事务传播方式
  5. 20.有效的括号(力扣leetcode) 博主可答疑该问题
  6. java tiles类似_java – 更好地替代Apache Tiles
  7. JDBC上传文件存入BLOB字段
  8. Nodejs文件相关操作
  9. 51nod 1022 石子归并 V2(四边形不等式)
  10. ssl 1606 选课