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实现


   

相关文章推荐

Android C 语言读取系统属性

NDK 编程,C 语言读取 Android 属性
  • foruok
  • foruok
  • 2014年01月03日 12:25
  • 15728

一步一步学习androidNDK编程(hello world)

上一篇博客,已经搭建好了windows下的linux环境(cygwine),这次我们试着写一个hello world。首先需要去android的官网下载android-ndk压缩包,之后解压,进入解压...

Android jni/ndk编程一:jni初级认识与实战体验

Android平台很多地方都可以看到jni的身影,比如之前接触到一个投屏的项目,主要的代码是c/c++写的,然后通过Jni供java层调用;另外,就拿Android系统中的Service来说,很多的S...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Android 开发 之 JNI入门 - NDK从入门到精通

NDK项目源码地址 :  -- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git  -- Java传递...

Android 一天搞定 NDK和JNI编程 3分钟学会写NDK实例

Android NDK 是在SDK前面又加上了原生二字,即Native Development Kit,因此又被Google称为NDK。 1、什么是JNI?      JNI全称 Jav...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

【Android】 JNI入门 - NDK从入门到精通

NDK项目源码地址 :  -- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git  -- Ja...
  • fu_zk
  • fu_zk
  • 2014年02月10日 10:41
  • 7484

android NDK基本操作

  • 2014年12月13日 17:30
  • 304KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android NDK编程浅入深出之--域和方法的操作
举报原因:
原因补充:

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