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

  • 相关阅读:
    字符设备驱动程序
    内存管理
    在React中使用context来传递属性
    iTerm2保存登录密码
    Mac OS设置终端 autocomplete 大小写不敏感
    Linux下安装Google SDK 配置Google API翻译环境
    使用Shell远程给Linux安装JDK
    Linux下wget命令 指定下载文件路径
    linux下解压/压缩命令
    获取鼠标在屏幕上的位置
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3170241.html
Copyright © 2011-2022 走看看