在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. public void onClick(View v) {
  14. if(v.getId() == R.id.button1 ){
  15. accessInstanceMethod("Instance Method Call");
  16. }
  17. if(v.getId() == R.id.button2 ){
  18. accessInstanceMethod("Static Method Call");
  19. }
  20. }
  21. }
  22. private void InstanceMethod(String str)
  23. {
  24. tv.setText(str);
  25. }
  26. private void static StaticMethod(String str)
  27. {
  28. tv.setText(str);
  29. }
  30. public native void accessInstanceMethod(String str);
  31. 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. jclass cls = (*env)->GetObjectClass(env,obj);
  12. jmethodID mid =
  13. (*env)->GetMethodID(env,cls,"InstanceMethod",
  14. "(Ljava/lang/String;)V");
  15. if(mid == NULL)
  16. return ;
  17. (*env)->CallVoidMethod(env,obj,mid,jstr);
  18. }
  19. void
  20. Java_com_android_jni_MyJNI_accessStaticMethod(JNIEnv *env,
  21. jobject obj, jstring jstr)
  22. {
  23. const jbyte *str;
  24. str = (*env)->GetStringUTFChars(env,jstr,NULL);
  25. if(str == NULL)
  26. return;
  27. __android_log_print(ANDROID_LOG_INFO,"-JNI-","%s",str);
  28. (*env)->ReleaseStringUTFChars(env,jstr,str);
  29. jclass cls = (*env)->GetObjectClass(env,obj);
  30. jmethodID mid =
  31. (*env)->GetStaticMethodID(env,cls,"StaticMethod",
  32. "(Ljava/lang/String;)V");
  33. if(mid == NULL)
  34. return ;
  35. (*env)->CallStaticVoidMethod(env,obj,mid,jstr);
  36. }

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

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

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

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

android jni (5)——Field & Method --> Accessing Mehtod的更多相关文章

  1. android JNI (二) 第一个 android工程

    下载NDK 后 它自带有 sample,初学者 可以导入Eclipse 运行 这里 我是自己创建的一个新工程 第一步: 新建一个Android工程 jni_test(名字自取) 第二步:为工程添加 本 ...

  2. 【转】android 电池(三):android电池系统

    关键词:android电池系统电池系统架构 uevent power_supply驱动 平台信息: 内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV3 ...

  3. 安卓开发_浅谈Android动画(四)

    Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1.  ValueAnimator 基本属 ...

  4. 【转】android Graphics(四):canvas变换与操作

    android Graphics(四):canvas变换与操作 分类: 5.andriod开发2014-09-05 15:05 5877人阅读 评论(18) 收藏 举报   目录(?)[+]   前言 ...

  5. android安全问题(八)伪造短信(利用原生android4.0漏洞)

    导读:本文利用android4.0的一个原生漏洞来伪造短信.无须声明任何权限即可伪造发送方为任何号码的短信给用户. android4.0发布已经是很久很久很久很久以前的事情了,这个漏洞早就报了出来,之 ...

  6. android Graphics(四):canvas变换与操作

    前言:前几篇讲解了有关canvas绘图的一些操作,今天更深入一些,讲讲对画布的操作,这篇文章不像前几篇那么容易理解,如果以前没有接触过画布的童鞋可能比较难以理解,为什么会这样.我尽量多画图,让大家更清 ...

  7. android Graphics(三):区域(Range)

    前言:最近几天对画图的研究有些缓慢,项目开始写代码了,只能在晚上空闲的时候捯饬一下自己的东西,今天给大家讲讲区域的相关知识,已经想好后面两篇的内容了,这几天有时间赶紧写出来给大家.有关界面开发的东东内 ...

  8. android Graphics(一):概述及基本几何图形绘制

    前言:我最近想抽空研究研究android的各种特效,android的特效真是其它平台无法比拟的,而且一个漂亮的UI交互,会给APP增色不少,而学习特效之前,有关graphics绘图的基础知识是必不可少 ...

  9. android - 自定义(组合)控件 + 自定义控件外观

    转载:http://www.cnblogs.com/bill-joy/archive/2012/04/26/2471831.html android - 自定义(组合)控件 + 自定义控件外观   A ...

随机推荐

  1. Qt on Android:让 Qt Widgets 和 Qt Quick 应用全屏显示

    Android 系统版本号非常多,较新的 4.4 ,较老的 2.3 ,都有人用. Qt on Android 开发的 Android 应用.默认在 Android 设备上是非全屏的. 而有些应用的需求 ...

  2. 操作系统——IO缓存技术

    一.为什么引入缓存技术 为了解决cpu速度和外部设备速度不匹配的问题. 降低了io对cpu的中断的次数.每进行一次IO设备的时间都非常长,所以把数据先放入缓冲区,再进行IO操作. 二.缓冲技术的实现 ...

  3. python之面向对象(一)

    python编程分为三个阶段: 面向过程编程:根据业务逻辑从上到下垒 函数式编程:将某功能进行函数封装,使用时调用函数即可,减少代码重复量 面向对象编程:对函数进行分类和封装 理论上我们是比较鄙视面向 ...

  4. 调用百度地图API实现手机自动定位 (逆地址解析)

    //声明地址解析器 var geoc = new BMap.Geocoder(); //自动定位 var autoLocation = function () { if (navigator.geol ...

  5. NFS(网络文件系统)

    http://baike.baidu.com/subview/44349/16134489.htm

  6. linux 虚拟机centos64位_6.5+VM10 主机是固定IP局域网设置代理上网,虚机设置固定ip 图文详细步骤

    一种: 虚机是Desktop 安装 1.虚拟机—设置—网络适配器子选项—选择“桥接模式” 2.在虚拟机中选择系统(System)—首选项(Preferences)—网络连接(Network Conne ...

  7. Ztree中simpleData是怎么转换成标准ztree数组对象的

    今天遇到一个自己构造树的情况,树是动态的,预先不知道根节点,用的是easyUI中的tree,于是参考了下Ztree中的实现,恍然大悟,遂记之: transformTozTreeFormat: func ...

  8. 慕课Linux学习笔记(三)系统分区

    Linux的系统分区 主分区:最多四个 扩展分区:最多只能一个,不能写入数据,只能包含逻辑分区 逻辑分区 必须分区: / (根分区) Swap 分区 (交换分区,内存的两倍,不超过2GB,如果内存大于 ...

  9. 【Nutch2.2.1源代码分析之5】索引的基本流程

    一.各个主要类之间的关系 SolrIndexerJob extends IndexerJob 1.IndexerJob:主要完成 2.SolrIndexerJob:主要完成 3.IndexUtil:主 ...

  10. js+jquery+html实现在三种不通的情况下,点击图片放大的效果

    js+jquery+html实现在三种不通的情况下,点击图片放大的效果. 三种情况分别是:图片的父元素宽高固定;  图片的宽高固定;  图片的父元素宽固定,高度不固定 第一种情况:图片的父元素宽高固定 ...