Android中JNI解析与分析


(以下内容仅为个人理解,欢迎大家指正)


一 从framework开始往下走中碰到的问题

首先就是AIDL,其实之前对于aidl一直有一个无法理解的点,但是后面,其实既然这个文件是java范畴的,所以可以把这个文件里理解为一些接口,接口的使用就是aidl的使用吧,只不过是说这些接口的注册是在server下面,可能这也就可以理解C/S架构下面的这种通信机制,其实这也就是进程之间的通信机制吧,之前也只是从字面的意思来理解什么是进程间,但是我之前理解的进程可能就是类似windows上面,不同的application之间,每一个application相当于一个进程,而android却不是这样的,他所谓的进程通信采用的时aidl这样的机制而已。


其实,进入JNI这个层面开始很多都是C或者C++的内容,但是,这里需要能够与java对应起来,所以需要采用JNI的编写机制来进行书写,既然时C++,我就用C++的方式来理解这层的代码,对应的各种类型也就可以对应到

JNI相当于一个结构体指针,因为java是面向对象的,所以


JAVA 中的DATA TYPE 与 C/C++ 略有不同,了解这些的目的也就是可以让我们理解后面介绍的一些jni的函数他们的返回值对应在不同语言两边的差异,而且这种差异有引起问题出现的可能性。

             JAVA                                   C/C++

char 


const struct JNINativeInterface .. = 

{

/*

* The following several entries were reserved for further

*/

NULL

NULL

NULL

NULL


GetVersion,

/*

* 其实这个下面的两个函数就像是连接C/C++ 中对应java中如下的代码

package *.*..;


class **{

}


*/

DefineClass,

FindClass,  既然是找到


FromReflectedMethod;

FromReflectedField;



}

JNI Env 应该是当前这个java环境吗

jint GetVersion(JNIEnv * );



这个地方有一个疑问,在JavaVM 中有相当于一个内存块,每一个jni的线程都需要一个这样的一个列表,所以

AttachCurrentThread 相当于java中的joint合并的方法,首先来执行合并的线程然后再来执行当前线程

因为JavaVM是一个指针列表,而且这个指针只能在当前线程中使用才能够合法调用,所以


JNI中数据类型理解

因为java中有boolean ,byte, string, int, array[], char, short, long,所以在JNI中需要有j*,*代表的是前面的所有类型,因为JNI用的是C的语法规则,


对于JNI中的函数理解

GlobalRef : 字面理解为全局变量

LocalRef:字面理解为本地变量


Java中的exceptions的理解


JNI中注册函数的目的


之前有说法是JAVA的运行效率非常慢,我想应该是需要把JAVA转化为C语言,然后编译运行所导致的吧。


多任务代表的时多进程,进程之间的通信与线程之间的通信是不同的,

多线程是指在同一个进程中有多个线程,这些线程共用同一个内存资源,然后之间可以通信,因为不同的进程的内存块是不同的,但是因为多线程就会存在内存块被不同线程所修该,所以所谓的锁的概念应该时同一个进程里而言。而且之前所提的线程的几个不同的状态,包括就绪 运行


线程和进程的状态的差别,线程有几种状态

这个地方还有一点需要提及的就是主线程的问题,每一个任务(进程)被创建出来的时候,一定会创建一个主线程,或者称被创建的线程为子线程,so 创建子线程的线程就是父线程。每一个进程都应该有一个main()函数作为进程的入口,return是用于进程调度的


这个有一个问题需要纠正的就是只有进程才能够新建线程,而线程是不能够新建线程的,所以在android系统下我们可以在设置中查看某一个应用程序所占用的进程数等等相关信息,其实这里的应用程序相当于任务,而每一个进程里面的可以新建某一些线程。

所以这个地方也就能够理解为什么每一个函数都会有返回值,因为有返回这样的目的就是能够得到这个线程或者进程会不会进入堵塞的状态

Native Language代表的有C C++ Assemble三种语言。


Appendix:

http://en.wikipedia.org/wiki/Java_Native_Interface



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值