面向对象的底层实现

java作为面向对象高级语言,可对现实世界进行建模。和面向过程不同的是面向对象软件的编写不是流程的堆积,而是对业务逻辑的多视角分解和分类。其过程大致为:
      1)、将知识分解成不同粒度的小概念。
      2)、对概念进行分类,形成类、模块、系统
      3)、用计算机语言将其实现为对象(包含操作和数据)

然而,大多程序员编写代码时很少思考面向对象的体系是如何实现的。因为它属于底层,并不必要。但是,学习过Java反射技术并有所思考的人会意识到,面向对象的种种语法本身也是有意思的系统。例如,属性本身是Field类的对象,方法是Method类的对象,甚至类也是Class类对象。

JNI学习总结

JNI是android中java与c的交互协议,它规定了java代码与c代码之间的相互调用、变量存取、新建对象等操作。java是面向对象语言,而c是面向过程语言。两者在语法和解决问题的思维方式上有所区别,那么如何解决其中的冲突呢?
      答案就是,深入到面向对象体系底层去,以属性、方法、类为单位进行操作。java的类跑在VM中,每一个对象、每一个方法、每一个属性、每一个类都由虚拟机进行管理,然后映射为底层二进制数据储存在内存中。因此,如果有一个VM的接口暴露给程序员,可以想象会发生什么事。我们可以不用new就新建对象,不用点调用函数,不用赋值号给属性赋值。我们可以通过请求VM,直接对属性、方法、类进行操作,这里与Java的反射机制有类似的地方。不一样的是,JNI中c调用java是用c语法而非java语法,c中直接通过关联到VM的指针做各种VM级的操作。
      总而言之,c调用java的整体思路就是通过VM对类、方法、属性和对象的管理实现面向对象动作的分解。

c中从当前对象thiz中获取类:
jclass clazz = (*env)->GetObjectClass(env,thiz);

从类中获取某函数ID:
jmethodID m_mid = (*env)->GetMethodID(env,clazz,"setV","(I)V");

使用对象和函数ID调用java对象里的对象函数(类函数使用类ID):
(*env)->CallVoidMethod(env,thiz,m_mid,data);

从类中获取属性ID:
jFiledID m_fid = (*env)->GetFiledID(env,clazz,"data","I");

使用对象和属性ID取java对象里的值:
int n = (int)(*env)->GetObjectFiled(env,thiz,m_fid);

获取某个类:
jclass rvclass = (*env)->FindClass(env,"com/misoo/counter/ResultValue");

类中获取构造函数ID:
jmethodID constr = (*env)->GetMethodID(env,rvclass,"<init>","()V");

新建对象:
jobject ref = (*env)->NewObject(env,rvclass,constr);

*以上env是指针变量,指向一个可以处理VM请求的对象。

android学习笔记----JNI中的c控制java的更多相关文章

  1. Android学习笔记--JNI的使用方法

    1.JNI是什么 JNI是Java Native Interface的缩写,它提供若干的API实现Java与其他语言之间的通信.而Android Framework由基于Java语言的的Java层与基 ...

  2. Android学习笔记(9):使用XML文件和Java代码控制UI界面

    Android推荐使用XML文件设置UI界面.然后用Java代码控制逻辑部分,这体现了MVC思想. MVC全名是Model View Controller.是模型(model)-视图(view)-控制 ...

  3. Android学习笔记----TimerTask中显示Toast的问题

    今天想在TimerTask的run函数中调用Toast显示一下提示信息,却总是导致程序崩溃.可是try语句块却又无法捕获到异常,代码如下: ...... Timer timer = new Timer ...

  4. [Android学习笔记]ListView中含有Button导致无法响应onItemClick回调的解决办法

    转自:http://www.cnblogs.com/eyu8874521/archive/2012/10/17/2727882.html 问题描述: 当ListView的Item中的控件只是一些展示类 ...

  5. Android学习笔记_49_Android中自定义属性(attrs.xml,TypedArray的使用)

    做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方 ...

  6. 【转】Pro Android学习笔记(十三):用户界面和控制(1):UI开发

    目录(?)[-] UI开发 方式一通过XML文件 方式二通过代码 方式三XML代码 UI开发 先理清一些UI概念: view.widget.control:这三个名词其实没有什么区别,都是一个UI元素 ...

  7. 【转】 Pro Android学习笔记(六九):HTTP服务(3):HTTP POST MultiPart

    目录(?)[-] 建立测试环境 开发环境导入第三方JAR HTTP Post Multipart小例子 HTTP POST不仅可以通过键值对传递参数,还可以携带更为复杂的参数,例如文件.HTTP Po ...

  8. 【转】Pro Android学习笔记(二五):用户界面和控制(13):LinearLayout和TableLayout

    目录(?)[-] 布局Layout 线性布局LinearLayout 表格布局TableLayout 布局Layout Layout是容器,用于对所包含的view进行布局.layout是view的子类 ...

  9. 【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter

    目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续 ...

随机推荐

  1. 学习Swift -- 错误处理

    错误处理 错误处理是响应错误以及从错误中返回的过程.swift提供第一类错误支持,包括在运行时抛出,捕获,传送和控制可回收错误. 一些函数和方法不能总保证能够执行所有代码或产生有用的输出.可空类型用来 ...

  2. hexdump——Linux系统的二进制文件查看工具

    hexdump是Linux下的一个二进制文件查看工具,可以将二进制文件转换为ASCII.10进制.16进制或8进制进行查看. 首先我们准备一个测试用的文件test,十六进制如下: 00 01 02 0 ...

  3. JSP 结构

    网络服务器需要一个JSP引擎,也就是一个容器来处理JSP页面. 容器负责截获对JSP页面的请求.本教程使用内嵌JSP容器的Apache来支持JSP开发. JSP容器与Web服务器协同合作,为JSP的正 ...

  4. 转载:用Dreamweave cs 5.5+PhoneGap+Jquery Mobile搭建移动开发

    转载地址:http://blog.csdn.net/haha_mingg/article/details/7900221 移动设备应用开发有多难,只要学会HTML5+Javascript就可以.用Dr ...

  5. Django自身的CBV列表

    慢慢就有感觉了.... 这个是可以快速开发很多东东,不过,类视图要求的积累还是有一些的.. ~~~~~~~~~~~~~ CBVs在功能上的可扩展性, 牺牲的是简单性, 一个CBV最多的时候拥有8个im ...

  6. Android应用--新浪微博客户端新特性滚动视图和启动界面实现

    新浪微博客户端新特性滚动视图和启动界面实现 2013年8月20日新浪微博客户端开发之启动界面实现 前言: 使用过新浪微博客户端的童鞋都清楚,客户端每一次升级之后第一次启动界面就会有新特性的介绍,用户通 ...

  7. Bluetooth LE(低功耗蓝牙) - 第二部分

    回顾 在前面的文章中我们介绍了Bluetooth LE的背景也说明了我们在本系列文章中将要开发什么,但是还没有实际的代码.我们将在这篇文章中纠正这一点,我们将通过定义 Service/Activity ...

  8. VM Depot 中国上的 Bitnami 镜像更新至 Ubuntu 14.04 LTS

     发布于 2014-08-13 作者 陈 忠岳 随着越来越多中国本地镜像源源不断地加入,  VM Depot 中国站点也在日益壮大(http://msopentech.com/?p=865871) ...

  9. vs默认的app.config是哪个?

    一:这次是进一步的三层构架,不过还是没有业务逻辑层,但有单独的层的文件夹,解决方案资源管理器图如下: 二:operatorDAl.cs代码: using System; using System.Co ...

  10. 用指针将字符串a的内容复制到字符串b

    #include <stdio.h> #include <stdlib.h> /**int main() { char a[]="i love you very ma ...