您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > 手机开发培训 05_Android的JAVA虚拟机和JAVA环境
Android的JAVA虚拟机和JAVA环境第一部分Dalvik虚拟机第二部分Android的JAVA程序环境第三部分JNI的使用第四部分系统服务的JAVA部分Android的JAVA虚拟机和JAVA环境第一部分Dalvik虚拟机Dalvik是Android程序的虚拟机,它执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中的dx工具转化成.dex格式由虚拟机执行。Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。第一部分Dalvik虚拟机Dalvik虚拟机的代码路径:dalvik/,其中包含了目标机和主机的内容。vm目录中的内容是虚拟机的实现,由本地代码实现(包含了部分的汇编代码),其编译的结果为共享库libdvm.co。libcore目录是一个提供了对基础JAVA实现支持的代码目录,包含了C语言代码和JAVA代码,编译的结果为JAVA的包core.jar。第一部分Dalvik虚拟机nativehelper库是一个工具库,用于注册JAVA本地调用的函数,在其他的代码中需要使用JNI从本地层次向JAVA层次提供功能的时候,需要使用这个库。nativehelper库的代码路径为:dalvik/libnativehelper。连接静态库libjavacore.a,生成动态库libnativehelper.so。nativehelper个库的头文件的路径为:libnativehelper/include/nativehelper/jni.h:基于JNI标准的头文件libnativehelper/include/nativehelper/JNIHelp.h:提供JNI注册功能的头文件第二部分Android的JAVA程序环境Android的API的层次结构:JAVA标准APIJAVA扩展API(javax包)企业和组织提供的java类库(org包)Android的各种包相比标准JAVA,Android中的JAVAAPI名称相同的API功能,但这些API并不是一个全集。第二部分Android的JAVA程序环境Android中的JAVA的库主要为android包及其子包,其中核心的包的目录为:frameworks/base/core/java/其中,各个子目录和文件是按照JAVA包的关系来组织的,例如文件:android/app/Activity.java它表示android.app包中的类Activity。第二部分Android的JAVA程序环境Android中JAVA类的API的描述文件包含在frameworks/base/api/目录的current.xml文件。主要使用的标签:package/packageclass/classinterface/interfaceimplements/implementsmethod/methodfield/field当注释中写入@hide的时候,就表示内容被隐藏了,即这个内容虽然出现在JAVA的源代码中,但是不被视为属于Android的系统API。第二部分Android的JAVA程序环境publicclassActivityextendsContextThemeWrapper//定义Activity类implementsLayoutInflater.Factory,Window.Callback,KeyEvent.Callback,OnCreateContextMenuListener,ComponentCallbacks{publicActivity(){++sInstanceCount;}//......省略}android.app.Activity类的定义:第二部分Android的JAVA程序环境packagename=android.appclassname=Activityextends=android.view.ContextThemeWrapperabstract=falsestatic=falsefinal=falsedeprecated=notdeprecatedvisibility=publicimplementsname=android.content.ComponentCallbacks/implementsimplementsname=android.view.KeyEvent.Callback/implementsimplementsname=android.view.LayoutInflater.Factory/implementsimplementsname=android.view.View.OnCreateContextMenuListener/implementsimplementsname=android.view.Window.Callback/implementsconstructorname=Activitytype=android.app.Activitystatic=falsefinal=falsedeprecated=notdeprecatedvisibility=public/constructor!--省略内容--/class!--省略内容--/package第三部分JNI的使用JNI是JavaNativeInterface的缩写,中文为JAVA本地调用。从Java1.1开始,JavaNativeInterface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI是本地编程接口。它使得在Java虚拟机(VM)内部运行的Java代码能够与用其它编程语言(如C、C++和汇编语言)编写的应用程序和库进行互操作。在Android中提供JNI的方式,让JAVA程序可以调用C语言的程序。第三部分JNI的使用VvoidJAVA的无返回值LjobjectJAVA对象Djdouble(IEEE754,64位)JAVA双精度浮(double)Fjfloat(IEEE754,32位)JAVA单精度浮点(float)Jjlong(64位有符号)JAVA长整型(long)Ijint(32位有符号)JAVA整型(int)Sjshort(16位有符号)JAVA短整型(shout)Cjchar(16位无符号)JAVA字符(char)Bjbyte(8位有符号)JAVA字节(byte)Zjboolean(8位无符号)JAVA布尔类型(boolean)对应的字母JNI的类型JAVA的类型第三部分Android中的JNIC/C++本地库JAVA框架JNIJAVA应用程序Android系统APIJAVA类(声明本地接口)在Android中提供JNI的方式,让JAVA程序可以调用C语言的程序。很多Android中JAVA的类都具有native的接口,这些nantive接口就是由本地实现,然后注册到系统中的。3.1JNI的实现方式在Android中,主要的JNI的代码在以下的路径中:frameworks/base/core/jni/这个路径中的内容将被编译成为库,libandroid_runtime.so,这就是一个普通的动态库,被放置在目标系统的/system/lib目录中。除此之外,Android还包含了其他的几个JNI的库,例如媒体部分的JNI在目录frameworks/base/media/jni/中,被编译成为库libmedia_jni.so。3.1JNI的实现方式JNI中各个文件的实际上就是C++的普通源文件,其命名一般和对应支持的JAVA类有对应关系。这种关系是习惯上的写法,而不是强制的。在Android中实现的JNI库,需要连接动态库libnativehelper.so。Android中使用JNI主要有两种方式:1.在框架层实现,连接JAVA框架和本地框架2.在应用程序的Apk包中实现android.util.Log类的情况:staticJNINativeMethodgMethods[]={{isLoggable,(Ljava/lang/String;I)Z,(void*)android_util_Log_isLoggable},{println,(ILjava/lang/String;Ljava/lang/String;)I,(void*)android_util_Log_println},};publicfinalclassLog{publicstaticnativebooleanisLoggable(Stringtag,intlevel);publicstaticnativeintprintln(intpriority,Stringtag,Stringmsg);}android_util_Log.cpp中的方法列表:3.2在框架层实现JNI注册JNI的情况:intregister_android_util_Log(JNIEnv*env){jclassclazz=env-FindClass(android/util/Log);//……省略其他处理的内容levels.verbose=env-GetStaticIntField(clazz,env-GetStaticFieldID(clazz,VERBOSE,I));levels.debug=env-GetStaticIntField(clazz,env-GetStaticFieldID(clazz,DEBUG,I));levels.info=env-GetStaticIntField(clazz,env-GetStaticFieldID(clazz,INFO,I));levels.warn=env-GetStaticIntField(clazz,env-GetStaticFieldID(clazz,WARN,I));levels.error=env-GetStaticIntField(clazz,env-GetStaticFieldID(clazz,ERROR,I));levels.assert=env-GetStaticIntField(clazz,env-GetStaticFieldID(clazz,ASSERT,I));returnAndroidRuntime::registerNativeMethods(env,android/util/Log,gMethods,NELEM(gMethods));}3.2在框架层实现JNIJNI的示例程序的路径:development/samples/SimpleJNI编译成的JNI动态库:libsimplejni.so编译成的JAVA包:SimpleJNI.apkTOP_LOCAL_PATH:=$(callmy-dir)#BuildactivityLOCAL_PATH:=$(TOP_LOCAL_PATH)include$(CLEAR_VARS)LOCAL_MODULE_TAGS:=samplesLOCAL_SRC_FILES:=$(callall-subdir-java-files)LOCAL_PACKAGE_NAME:=SimpleJNILOCAL_JNI_SHARED_LIBRARIES:=libsimplejniinclude$(BUILD_PACKAGE)include$(callall-makefiles-under,$(LOCAL_PATH))3.3在Apk中实现JNI第三部分JNI的使用staticjintadd(JNIEnv*env,jobjectthiz,jinta,jintb){intresult=a+b;LOGI(%d+%d=%d,a,b,result);returnresult;}staticJNINat
本文标题:手机开发培训 05_Android的JAVA虚拟机和JAVA环境
链接地址:https://www.777doc.com/doc-7211258 .html