当前位置: 首页 > news >正文

Android JNI修改Java对象的变量

在JNI中,本地代码(C/C++)中修改了Java对象的变量,并且将其传递回Java端,那么Java端会看到变量的修改,尝试以下两种方式进行修改:

  1. 添加native方法

    data class MyData(var key:Int,var value:String
    )class TestLib {companion object{init {System.loadLibrary("jnitest")}}external fun modifyData(data:Int)external fun modifyMyData(data:MyData)
    }var data  = 1
    Log.i(TAG,"in = ${data}")
    testLib.modifyData(1)
    Log.i(TAG,"out = ${data}")
    var myData = MyData(1,"Hello")
    Log.i(TAG,"mydata in = ${myData.toString()}")
    testLib.modifyMyData(myData)
    Log.i(TAG,"mydata in = ${myData.toString()}")
    
  2. C++

     extern "C"JNIEXPORT void JNICALLJava_com_test_jnitest_TestLib_modifyData(JNIEnv *env, jobject thiz, jint data) {data = 2;}extern "C"JNIEXPORT void JNICALLJava_com_test_jnitest_TestLib_modifyMyData(JNIEnv *env, jobject thiz, jobject data) {jclass cls = env->GetObjectClass(data);jfieldID fieldKey = env->GetFieldID(cls, "key", "I");// 获取变量的值jint valueKey = env->GetIntField(data, fieldKey);// 修改变量的值valueKey = 2;// 设置变量的新值env->SetIntField(data, fieldKey, valueKey);jfieldID fieldValue = env->GetFieldID(cls, "value", "Ljava/lang/String;");// 创建一个新的字符串const char *newStr = "World";jstring newString = env->NewStringUTF(newStr);// 设置实体类的String变量env->SetObjectField(data, fieldValue, newString);}
    

    日志打印:

     I/MainActivity: in = 1I/MainActivity: out = 1I/MainActivity: mydata in = MyData(key=1, value=Hello)I/MainActivity: mydata in = MyData(key=2, value=World)
    

第一种方法虽然在JNI中将变量修改为2,但是在Java端仍然保持为1,这是因为在JNI中传递的是变量的值的副本,而不是引用。要在JNI中更改Java对象的变量,需要通过第二种传递对象的引用来实现,使用JNI函数获取和设置变量的值,成功地更改Java对象的变量。

http://www.lryc.cn/news/138538.html

相关文章:

  • VS+Qt 自定义Dialog
  • 从零开始学习 Java:简单易懂的入门指南之时间类(十七)
  • List 去重两种方式:stream(需要JDK1.8及以上)、HashSet
  • 5.8.webrtc事件处理基础知识
  • 无人机甚高频无线电中继通讯U-ATC118
  • 基于5G边缘网关的储能在线监测方案
  • 软件机器人助力基层网点实现存款数据自动化处理
  • Win10怎么关闭自动更新?简单4招为你解决烦恼!
  • 【AWS】安装配置适用于 Eclipse 的 AWS 工具包
  • vue页面在table字段后加单位
  • RK3588平台开发系列讲解(AI 篇)RKNN-Toolkit2 模型的加载
  • Nexus2迁移升级到Nexus3
  • 在线OJ平台项目
  • go语言kafka入门
  • 自定义拖拽功能,上下拖拽改变盒子高度
  • JavaScript Es6_4笔记
  • Python“牵手”易贝(Ebay)商品列表数据,关键词搜索ebayAPI接口数据,ebayAPI接口申请指南
  • C语言:选择+编程(每日一练Day8)
  • 使用 uniapp 适用于wx小程序 - 实现移动端头部的封装和调用
  • ARM Linux 系统稳定性分析入门及渐进 13 -- gdb 反汇编 disassemble 命令详细介绍及举例】
  • python连接Microsoft SQL Server 数据库
  • docker可视化工具
  • MySQL 用户管理操作
  • 【python办公自动化】PysimpleGUI中的popup弹窗中的按钮设置居中
  • postgresql 同步流复制两个相关参数synchronous_commit 和 synchronous_standby_names
  • 运算放大器发展史
  • LVS+Keepalived 实验
  • FreeSWITCH 1.10.10 简单图形化界面1 - docker/脚本/ISO镜像安装
  • 内网渗透神器CobaltStrike之权限提升(七)
  • 使用haproxy搭建web架构