JNI攻略之七――操作对象的方法

JNI攻略之七――操作对象的方法

       Java中的方法一般有两种:1.实例方法;2.类方法。对应的在JNI中也有两种操作Java对象的方法。下面是如何操作这些方法的例子!

 

一、         操作实例方法

       下面是一个包含一个本地方法的类。本地方法演示了如何操作java类的实例方法。下面是源代码。

public class InstanceMethodCall {  

      private native void nativeMethod();                  //本地方法

      private void callback() {                             //类的实例方法

            System.out.println("Called In Java");

      }

     

      public static void main(String args[]) {

            InstanceMethodCall c = new InstanceMethodCall();

            c.nativeMethod();                                //调用实例的本地方法

      }

      static {                                              //加载动态链接库

            System.loadLibrary("InstanceMethodCall");

      }

}

 

      下面是本地方法的实现。

#include <stdio.h>

#include <stdarg.h>

#include <jni.h>

 

JNIEXPORT void JNICALL Java_InstanceMethodCall_nativeMethod(JNIEnv *env, jobject obj){

      jclass cls = (*env)->GetObjectClass(env, obj);                 //第一步,得到对象的类

      jmethodID mid =(*env)->GetMethodID(env,cls, "callback", "()V");

                                                  //第二步,得到对象的方法

                                                  //第一个参数为env――一般不变

                                                  //第二个参数为方法的类

                                                  //第三个参数为方法的名称

                                                  //第四个参数为方法的signature

      if (mid == NULL) {            return;   }

      printf("Called In C n");

      (*env)->CallVoidMethod(env ,obj, mid);         //第三步,调用方法

                                                             //下面会有对该方法的总结

}

 

 

结果:

Called In Java

Called In C

 

操作类的实例方法主要有三个步骤:

1.       得到类的类。使用函数:

            jclass GetObjectClass(JNIEnv *env, jobject obj);

2.       得到你要调用的实例方法的标识符。使用函数:

      jmethodID GetMethodID(JNIEnv *env, jclass clazz,const char *name, const char *sig);

3.       调用该实例方法。使用函数:

      <NativeType> Call<Type>Method(JNIEnv *env,jobject obj, jmethodID methodID, ...);

      <Type>可以为byteshortintfloatdoublebooleanchar以及其它引用类型。

 

二、         操作类方法

       下面是一个包含一个本地方法的类。本地方法演示了如何操作java类的静态方法。下面是源代码。

public class StaticMethodCall {

      private native void nativeMethod();           //本地方法

      private static void callback() {           //类的静态方法,在本地方法中调用

            System.out.println("Called In Java ");

      }

      public static void main(String args[]) {

            StaticMethodCall c = new StaticMethodCall();

            c.nativeMethod();

      }

      static {

            System.loadLibrary("StaticMethodCall");

      }

}

 

下面是对本地方法实现的源代码。主要演示如何在本地方法中调用类的静态方法。

#include <stdio.h>

#include <stdarg.h>

#include <jni.h>

 

JNIEXPORT void JNICALL

Java_StaticMethodCall_nativeMethod(JNIEnv *env, jobject obj){

      jclass cls = (*env)->GetObjectClass(env, obj);                 //第一步,得到对象的类

      jmethodID mid =(*env)->GetStaticMethodID(env, cls, "callback", "()V");

                                                             //得到对象的静态方法

                                                             //与实例方法的区别有一点

                                                             //就是方法名多了个Static

      if (mid == NULL) {            return; }

      printf("Called In C n");

      (*env)->CallStaticVoidMethod(env, cls, mid);      //第三步,调用方法

                                                       //与调用实例方法的差别有两点:

                                                        //1.方法名加了Static

                                                       //方法的第二个参数为jclass类型

}

 

操作类的静态方法主要有三个步骤:

1.       得到类的类。使用函数:

            jclass GetObjectClass(JNIEnv *env, jobject obj);

2.       得到你要调用的静态方法的标识符。使用函数:

      jmethodID GetStaticMethodID(JNIEnv *env,jclass clazz, const char *name,const char *sig);

3.       调用该静态方法。使用函数:

      <NativeType> CallStatic<Type>Method(JNIEnv *env, jclass clazz,jmethodID methodID, ...);

      一定要看好了参数哦!<Type>可以为byteshortintfloatdoublebooleanchar以及其它引用类型。

 

      操作对象的方法也是比较简单的!主要分为3步。实例方法和静态方法的使用仅仅是第三步的两个微小的参别!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值