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

在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就介绍到这,关于别的返回值的函数大家可以自己去尝试,用法都是差不多的。

 

posted @ 2013-07-03 20:32  爱生活,爱编程  阅读(278)  评论(0编辑  收藏  举报