android jni (5)——Field & Method --> Accessing Mehtod

7 篇文章 0 订阅

在java编程语言中有非静态成员函数和静态成员函数,JNI允许我们访问到java中的成员函数,然后再jni中调用,这里我就来举例说明在jni中是如何做到的。

我们先在java中定义2个成员函数,一个非静态的,一个是静态的,分别会把title的textView设置成不同的值:

[java]  view plain copy
  1.   public void onCreate(Bundle savedInstanceState) {  
  2.       super.onCreate(savedInstanceState);  
  3.       setContentView(R.layout.main);  
  4.       mContext = this;  
  5.       bt1 = (Button)findViewById(R.id.button1);  
  6.       bt2 = (Button)findViewById(R.id.button2);  
  7.       tv = (TextView)findViewById(R.id.tv);  
  8.       tv.setText(""+si);  
  9.       bt1.setOnClickListener(new MyButtonListener());  
  10.       bt2.setOnClickListener(new MyButtonListener());  
  11.   }  
  12.   class MyButtonListener implements OnClickListener{  
  13.   
  14. public void onClick(View v) {  
  15.     if(v.getId() == R.id.button1 ){  
  16.         accessInstanceMethod("Instance Method Call");  
  17.     }  
  18.     if(v.getId() == R.id.button2 ){  
  19.         accessInstanceMethod("Static Method Call");  
  20.     }  
  21. }  
  22.   }  
  23.   private void InstanceMethod(String str)  
  24.   {  
  25.     tv.setText(str);  
  26.   }  
  27.   private void static StaticMethod(String str)  
  28.   {  
  29.     tv.setText(str);  
  30.   }  
  31.   public native void accessInstanceMethod(String str);  
  32.   public native void accessStaticMethod(String str);  

我们再来看下jni中是如何处理的:

[cpp]  view plain copy
  1. void   
  2. Java_com_android_jni_MyJNI_accessInstanceMethod(JNIEnv *env,  
  3.         jobject obj, jstring jstr)  
  4. {  
  5.     const jbyte *str;  
  6.     str = (*env)->GetStringUTFChars(env,jstr,NULL);  
  7.     if(str == NULL)  
  8.         return ;  
  9.     __android_log_print(ANDROID_LOG_INFO,"-JNI-","%s",str);  
  10.     (*env)->ReleaseStringUTFChars(env,jstr,str);  
  11.   
  12.     jclass cls = (*env)->GetObjectClass(env,obj);  
  13.     jmethodID mid =   
  14.         (*env)->GetMethodID(env,cls,"InstanceMethod",  
  15.                 "(Ljava/lang/String;)V");  
  16.     if(mid == NULL)  
  17.         return ;  
  18.     (*env)->CallVoidMethod(env,obj,mid,jstr);  
  19. }  
  20.   
  21. void  
  22. Java_com_android_jni_MyJNI_accessStaticMethod(JNIEnv *env,  
  23.         jobject obj, jstring jstr)  
  24. {  
  25.     const jbyte *str;  
  26.     str = (*env)->GetStringUTFChars(env,jstr,NULL);  
  27.     if(str == NULL)  
  28.         return;  
  29.     __android_log_print(ANDROID_LOG_INFO,"-JNI-","%s",str);  
  30.     (*env)->ReleaseStringUTFChars(env,jstr,str);  
  31.   
  32.     jclass cls = (*env)->GetObjectClass(env,obj);  
  33.     jmethodID mid =   
  34.         (*env)->GetStaticMethodID(env,cls,"StaticMethod",  
  35.                 "(Ljava/lang/String;)V");  
  36.     if(mid == NULL)  
  37.         return ;  
  38.     (*env)->CallStaticVoidMethod(env,obj,mid,jstr);  
  39. }  

这边都比较简单,先是找到class,然后得到method ID,之后是根据method ID调用JAVA中的function

运行模拟器,点击不同的按钮观察title的textView:


-----------------------------------------------------------------------------------------------------

调用java的method就介绍到这,关于别的返回值的函数大家可以自己去尝试,用法都是差不多的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅气的东哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值