zoukankan      html  css  js  c++  java
  • 【详解】JNI (Java Native Interface) (三)

    案例三:C代码访问Java对象的实例变量

        获取对象的实例变量的步骤:

      1. 通过GetObjectClass()方法获得此对象的类引用

      2. 通过类引用的GetFieldID()方法获得实例变量的Field ID.

        你需要提供 变量名字段类型描述符

      • 对于Java 类, 字段描述符格式为 "L<类全称>;" 类全称中,点"."用 "/"代替。例如,String 的描述符为"Ljava/lang/String;"

          注意:这里不要漏了分号";"

      • 对于基本类型,则有固定标识。注:这里不需要分号。

          int =>  "I" ,byte => "B",short => "S",long => "J",float => "F",double => "D",char => "C",boolean => "Z"

      • 对于数组,则结合以上类型描述符,加上前缀"[",

          如Object数组,用"[L/java/lang/Object;"表示

          int数组,用"[I"表示

       3. 基于FieldID,通过GetObjectField()方法或Get<基本类型>Field()方法获取实例变量。

       4. 如果需要更新实例变量,可以使用SetObjectField()或Set<基本类型>Field()函数进行

       以下是JNI用于获取实例变量的函数:(来自于头文件jni.h)

      

      此案例所有文件:

      

      (1)创建Java程序

           

      定义两个实例变量,一个为基本类型,另一个为对象类型。利用C代码对其进行更改,然后输出结果,校验其实例变量是否改变。

       (2)编译Java程序,并生成相关头文件

           

      

       (3)编写源文件实现。

       

      根据上述描述的获取成员变量的步骤进行。

      注:由于String在c语言中没有直接映射的类型,只能通过相关函数转换为以''结尾的字符数组。

       (4)生成动态链接库,注这里直接指定库名为libdemo3.so,至于为何要加前缀lib,请看前文

      

       (5)执行Java程序

      

       由图可知,C代码成功改变了Java对象实例变量的值。

      

  • 相关阅读:
    AngularJS 最常用的八种功能
    angularJs自定义模块
    angularJs 购物车模型
    angularJs-未加载完成的页面显示混乱ng-bind
    angularJs-脏检查
    angularJs-控制器
    【转载更新】Linux工具之SED 2.应用实例
    【转载更新】Linux工具之SED 1.基础知识
    【转载更新】Linux工具之AWK 4.实例
    【转载更新】Linux工具之AWK 3.高级知识
  • 原文地址:https://www.cnblogs.com/longfurcat/p/9856627.html
Copyright © 2011-2022 走看看