Android NDK编程浅入深出之--域和方法的操作

原创 2015年07月07日 19:01:56

访问域 

Java 有两类域:实例域和静态域。类的每个实例都有自己的实例域副本,而一个类所有实例共享一个静态域。如下程序:

public class JavaClass{

        /** 实例域 */
      private String instanceField = "Instantce Field";

      /** 静态域 */
      private static String staticField = "Static Field";

 }

JNI 提供了访问两类域的函数。

  1.获取域ID

通过给定实例的 class 对象获取域 ID,用 GetObjectClass 函数获取 class 对象。如下代码:

jclass clazz = (*env) -> GetObjectClass(env,instance);

GetFieldID 获取实例域ID:

jfieldID instanceFieldId = (*env)->GetFieldID(env,clazz,"instanceField","Ljava/lang/String;");

GetStaticFieldID 获取静态域ID:

jfieldID instanceFieldId = (*env)->GetStaticFieldID(env,clazz,"staticField","Ljava/lang/String;");

上面两个方法的第三个参数代表要获取的域名称,第四个参数表示域类型,这里"Ljava/lang/String;" 表示String型,在后面会详细讲。

为了提高应用程序的性能,可以缓存域 ID,一般总是缓存使用频率最高的域 ID。

2.获取域

在获取域 ID 以后,可以用 Get<type>Field 函数获得实际的实例域,如下程序:

   
    /** 获取实例域  */
    jstring instanceField = (*env)->GetObjectField(env,instance,instanceFieldId);
    
    /** 获取静态域 */
    jstring staticField = (*env)->GetStaticObjectField(env,clazz,staticFieldId);
 
     获取单个域值需要调用两到三个 JNI 函数,原生代码回到 Java 中获取每个单独的域值,这个应用程序增加了额外的负担,进而导致性能下降。建议将所有需要的参数传递给原生方法调用,而不是让原生代码回到 Java 中。在内存溢出的情况下,这些函数均返回NULL,此时原生代码奖不再继续执行。

调用方法

与域一样 Java 中又两类方法: 实例方法和静态方法。

public class JavaClass{

<span style="white-space:pre">	</span>private String instanceMethod{
<span style="white-space:pre">		</span>return "Instance Method";
<span style="white-space:pre">	</span>}

<span style="white-space:pre">	</span>publice static String staticMethod{
<span style="white-space:pre">		</span>return "Static Method";
<span style="white-space:pre">	</span>}

 ....


      1.获取方法 ID 

通过给定实例的 class 对象获取方法 ID。用 GetMethod 函数获取实例方法的方法 ID。

jmethodID instatnceMethodId;

instanceMethodId = (*env) -> GetMethodID(env, clazz,"instatnceMethod","()Ljava/lang/String;");

用 GetStaticMethodID 函数获取静态域的方法 ID。

jmethodID staticMethodId;

staticMethodId= (*env) -> GetStaticMethodID(env, clazz,"staticMethod","()Ljava/lang/String;");


      2.调用方法

通过 Call<Type>Method 类函数调用实例的实例方法。

jstring instanceMethodResult;

instanceMethodResult = (*env) -> CallStringMethod(env,instatnce,instatnceMethodId);

通过 CallStatic<Type>Field 类函数调用静态方法。

jstring staticMethodResult;

staticMethodResult = (*env) -> CallStaticStringMethod(env,clazz,staticMethodId);


域和方法描述符




(未完待续)

               

             Android NDK编程浅入深出之--了解NDK

             Android jni编程浅入深出之-- 与原生代码通信 

             Android NDK编程浅入深出之--Android.mk  

             Android NDK编程浅入深出之--访问域

            Android native Socket实现


   

CSS 之 浅入浅出

css,层叠样式表(英语:Cascading Style Sheets,简写CSS),又称串样式列表、层次结构式样式表文件,一 种用来为结构化文档(如HTML文档或XML应用)添加样式(字体、间距和颜...
  • zhangzijiejiayou
  • zhangzijiejiayou
  • 2014年10月09日 09:20
  • 1743

Android NDK编程浅入深出之--了解NDK

Android NDK不是一个单独的工具;它是一个包含API、交叉编译器、链接程序、调试器、构建工具、文档和示例应用程序的综合工具集。...
  • jmq_0000
  • jmq_0000
  • 2014年08月24日 22:02
  • 1457

浅入浅出 Android 安全:第一章 Android

第一章 Android 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 Android 安全架构的理...
  • wizardforcel
  • wizardforcel
  • 2016年11月27日 16:52
  • 572

jsonp浅入深出

json相信大家都用的多,jsonp我就一直没有机会用到,但也经常看到,只知道是“用来跨域的”,一直不知道具体是个什么东西。今天总算搞明白了。下面一步步来搞清楚jsonp是个什么玩意。   ...
  • u012942894
  • u012942894
  • 2014年12月23日 11:14
  • 463

clone方法 --深拷贝与浅拷贝

Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象...
  • cws1214
  • cws1214
  • 2016年08月12日 16:58
  • 2270

C++的深拷贝与浅拷贝

对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=88; int b=a;  而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单...
  • lpp0900320123
  • lpp0900320123
  • 2014年09月02日 15:35
  • 39707

C++ 深拷贝 与 浅拷贝

本文分三部分阐释深拷贝于浅拷贝,着眼点主要还是在深拷贝。第一部分讲述为什么会有拷贝,即对象之间的复制。第二部分讲述为什么会有深拷贝于浅拷贝,即类成员存在资源分配。第三部分阐释深拷贝于浅拷贝的定义与使用...
  • u013630349
  • u013630349
  • 2015年06月01日 22:33
  • 933

java 浅堆和深堆

浅堆和深堆 浅堆(Shallow Heap)和深堆(Retained Heap)是两个非常重要的概念,它们分别表示一个对象结构所占用的内存大小和一个对象被GC回收后,可以真实释放的内存大小。 ...
  • luohai859
  • luohai859
  • 2016年02月29日 16:47
  • 1144

Java中深拷贝和浅拷贝的研究

Java中深拷贝和浅拷贝的研究这篇博文主要来研究下深拷贝和浅拷贝吧
  • u010412719
  • u010412719
  • 2015年10月24日 22:00
  • 353

Python 赋值、浅拷贝、深拷贝的区别?

http://songlee24.github.io/2014/08/15/python-FAQ-02/ 在写Python过程中,经常会遇到对象的拷贝,如果不理解浅拷贝和深拷贝的概念...
  • yugongpeng_blog
  • yugongpeng_blog
  • 2015年06月23日 12:20
  • 3202
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android NDK编程浅入深出之--域和方法的操作
举报原因:
原因补充:

(最多只允许输入30个字)