




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Android程序架构1、java app2、Android.mk3、JNI4、Binder与AIDLAndroid Application 使用eclipse开发,在模拟器上调试 编写Android.mk,使用make编译ARM版,在开发板上运行Eclipse IDE 安装Eclipse 建立android工程 管理AVD 运行示例程序Android App AndroidManifest.xml Android.mkAndroidManifest.xml . . . AndroidManifest.xml . . . . . . packages/apps/Browser为例http:/
2、LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := helloworldLOCAL_SRC_FILES := helloworld.c Include $(BUILD_SHARED_LIBRARY)参考:android-ndk-1.5_r1/docs/ANDROID-MK.TXThttp:/ functionsIf you source the file build/envsetup.sh into your bash environment, . build/envsetup.shyoull get a few
3、 helpful shell functions: printconfig - Prints the current configuration as set by the lunch and choosecombo commands. m - Runs make from the top of the tree. This is useful because you can run make from within subdirectories. If you have the TOP environment variable set, it uses that. If you dont,
4、it looks up the tree from the current directory, trying to find the top of the tree. mm - Builds all of the modules in the current directory. mmm - Builds all of the modules in the supplied directories. croot - cd to the top of the tree. sgrep - grep for the regex you provide in all .c, .cpp, .h, .j
5、ava, and .xml files below the current directory. mmm packages/apps/Contacts/ JNI界面在Android应用框架里,应用层的软件大多是Java的,而系统层的软件大多是C或C+的。Android使用JNI界面来达成这个目标。例如,在Android里有个MediaPlayer.cpp类,当它搭配上JNI界面之后,在VM上执行的MediaPlayer.java就可以通过JNI界面与MediaPlayer.cpp类沟通了。 JNI-如何载入*.so 应用层的Java类是在虚拟机(VM: Virtual Machine)是运行的
6、,而C组件不是在VM上运行,那么Java程序是如何要求VM去加载所指定的C组件呢?可使用下述指令:System.loadLibrary(*.so库名); 例如Android框架里所提供的MediaPlayer.java类,内含指令public class MediaPlayer static System.loadLibrary(media_jni); 这就要求VM去加载Android的/system/lib/libmedia_jni.so库。加载*.so库之后,Java类与*.so库就结合在一起运行了。JNI-*.so库的入口函数当VM运行到System.loadLibrary()函数时,首
7、先会去运行C组件里的JNI_OnLoad()函数。它的用途有两个:告诉VM此C组件使用的是哪一个JNI版本,如果你的*.so库没有提供JNI_OnLoad()函数,VM会默认该*.so库是使用最老的JNI 1.1版本。由于新版的JNI做了许多扩充,如果需要使用JNI的新版功能,例如JNI 1.4的java.nio.ByteBuffer, 就必須通过JNI_OnLoad()函数来告知VM。由于VM运行到System.loadLibrary()函数时,就会先调用JNI_OnLoad(),所以C组件的开发者可以通过JNI_OnLoad()来初始化C组件JNI_OnUnload()函数与JNI_OnL
8、oad()是相对应的。当VM释放C组件时,就会调用JNI_OnUnload()函数来进行善后清除工作。当VM调用JNI_OnLoad()或JNI_Unload()函数时,都会将VM的指针传给它们,其参数如下:jint JNI_OnLoad(JavaVM* vm, void* reserved) jint JNI_OnUnload(JavaVM* vm, void* reserved) JNI-接口函数和指针(1) 在JNI_OnLoad()函数里,可通过VM指针取得JNIEnv指针,并存入到env指针数组里,如下:jint JNI_OnLoad(JavaVM* vm, void* reserv
9、ed)JNIEnv* env = NULL;jint result = -1;if (vm-GetEnv(void*) &env, JNI_VERSION_1_4) != JNI_OK)LOGE(“ERROR: GetEnv failedn”);goto bail;由于VM通常是多线程的,每一个线程在调用JNI_OnLoad()时,所传进来的JNIEnv指针都是不同的。为了配合这种多线程的环境C组件开发者在撰写本地函数时,通过JNIEnv指针的不同来避免多线程冲突问题,才能确保所写的本地函数能安全地在Android的多线程VM环境中运行。因此当调用C组件的函数时,都会将JNIEnv指针
10、传递给它 JNI-接口函数和指针(2)Native code accesses Java VM features by calling JNI functions. JNI functions are available through an interface pointer. An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function. Every interface fun
11、ction is at a predefined offset inside the array. The JNI interface is organized like a C+ virtual function table or a COM interface. The advantage to using an interface table, rather than hard-wired function entries, is that the JNI name space becomes separate from the native code. A VM can easily
12、provide multiple versions of JNI function tables.JNI-registerNativeMethods 应用层的java类通过VM来调用本地函数。一般都是依赖VM去寻找*.so里的本地函数。如果需要连续调用很多次,每次都需要寻找一遍,需要花很多时间。此时,组件开发者可以自行将本地函数向VM进行登记。static JNINativeMethod gMethods = setDataSource, (Ljava/lang/String;)V,(void *)android_media_MediaPlayer_setDataSource,getFrame
13、At, (I)Landroid/graphics/Bitmap;, (void *)android_media_MediaPlayer_getFrameAt,native_setup, (Ljava/lang/Object;)V, (void *)android_media_MediaPlayer_native_setup,;static int register_android_media_MediaPlayer(JNIEnv *env) return AndroidRuntime:registerNativeMethods(env,android/media/MediaPlayer, gM
14、ethods, NELEM(gMethods);JNI-Resolving Native Method NamesDynamic linkers resolve entries based on their names. A native method name is concatenated from the following components: the prefix Java_a mangled fully-qualified class namean underscore (“_”) separatora mangled method namefor overloaded nati
15、ve methods, two underscores (“_”) followed by the mangled argument signature_1 the character “_” _2 the character “;” in signatures _3 the character “ in signatures 参考:http:/ pkg; class Cls native double f(int i, String s);. jdouble Java_pkg_Cls_f_ILjava_lang_String_2 (JNIEnv *env, /* interface poin
16、ter */ jobject obj, /* this pointer */ jint i, /* argument #1 */ jstring s) /* argument #2 */ /* Obtain a C-copy of the Java string */ const char *str = (*env)-GetStringUTFChars(env, s, 0); /* process the string */ . /* Now we are done with str */ (*env)-ReleaseStringUTFChars(env, s, str); return .
17、Binder-Binder的组成 驱动程序部分:kernel/include/linux/binder.hkernel/drivers/android/binder.c binder库部分frameworks/base/include/utils/* frameworks/base/libs/utils/* servicemanager部分 servicemanager是一个守护进程,用于这个进程和/dev/binder通讯,从而达到管理系统中各个服务的作用。sp defaultServiceManager(); frameworks/base/cmds/servicemanager/bind
18、er.hframeworks/base/cmds/servicemanager/binder.cframeworks/base/cmds/servicemanager/service_manager.c http:/ Manager是一个守护进程,它负责启动各个进程之间的服务,对于相关的两个需要通讯的进程,它们通过调用libutil.so库实现通讯,而真正通讯的机制,是内核空间中的一块共享内存。Binder的工作机制(2)http:/ 本地:例如BnABC,这是一个需要被继承和实现的类。 实现BnABC: BnTransact() 注册服务:IServiceManager:AddService
19、Proxy 代理:例如BpABC,这是一个在接口框架中被实现,但是在接口中没有体现的类。实现几个功能函数,调用BpABC:remote()-transact()客户端:例如客户端得到一个接口ABC,在调用的时候实际上被调用的是BpABC ,继而通过IPC调用了BnABC,然后调用了具体的功能 在程序的实现过程中BnABC和BpABC是双继承了接口ABC。一般来说BpABC是一个实现类,这个实现类不需要在接口中体现,它实际上负责的只是通讯功能,不执行具体的功能;BnABC则是一个接口类,需要一个真正工作的类来继承、实现它,这个类才是真正执行具体功能的类。 Binder的实现(3)class IP
20、ermissionController : public IInterfacepublic: DECLARE_META_INTERFACE(PermissionController); virtual bool checkPermission(const String16& permission,int32_t pid, int32_t uid) = 0; enum CHECK_PERMISSION_TRANSACTION = IBinder:FIRST_CALL_TRANSACTION ;class BnPermissionController : public BnInterfac
21、epublic: virtual status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0);Binder的实现(4)class BpPermissionController : public BpInterfacepublic: BpPermissionController(const sp& impl) : BpInterface(impl) virtual bool checkPermission(const String16& permiss
22、ion, int32_t pid, int32_t uid) Parcel data, reply; data.writeInterfaceToken(IPermissionController: getInterfaceDescriptor(); data.writeString16(permission); data.writeInt32(pid); data.writeInt32(uid); remote()-transact(CHECK_PERMISSION_TRANSACTION, data, &reply); if (reply.readInt32() != 0) retu
23、rn 0; return reply.readInt32() != 0; ;IMPLEMENT_META_INTERFACE(PermissionController, android.os.IPermissionController);Binder的实现(5)status_t BnPermissionController: BnTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) switch(code) case CHECK_PERMISSION_TRANSACTION: CHECK_
24、INTERFACE(IPermissionController, data, reply); String16 permission = data.readString16(); int32_t pid = data.readInt32(); int32_t uid = data.readInt32(); bool res = checkPermission(permission, pid, uid); reply-writeInt32(0); reply-writeInt32(res ? 1 : 0); return NO_ERROR; break; default: return BBin
25、der: BnTransact(code, data, reply, flags); Android应用程序架构-MediaPlayer (1)MediaPlayer的代码主要在以下的目录中:lJAVA程序的路径:packages/apps/Music/src/com/android/music/lJAVA类的路径:frameworks/base/media/java/android/media/MediaPlayer.javalJAVA本地调用部分(JNI):frameworks/base/media/jni/android_media_MediaPlayer.cpp这部分内容编译成为目标是
26、libmedia_jni.so。l主要的头文件在以下的目录中:frameworks/base/include/media/l多媒体底层库在以下的目录中:frameworks/base/media/libmedia/ 这部分的内容被编译成库libmedia.so。l多媒体服务部分:frameworks/base/media/libmediaplayerservice/文件为mediaplayerservice.h和mediaplayerservice.cpp这部分内容被编译成库libmediaplayerservice.so。l基于OpenCore的多媒体播放器部分 external/opencore/这部分内容被编译成库libopencoreplayer.so
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年法学概论考试的专业素养要求及试题及答案
- 跨平台开发的最佳实践试题及答案
- 2025年用户界面设计考题及答案
- 大规模并行计算的实践与应用试题及答案
- 法学理论的形成与发展试题及答案
- 法学概论中的法律条款解读技巧试题及答案
- 软件生命周期模型2025年考试试题及答案
- 风险管理中的数据分析技术试题及答案
- 法学概论重要论文引述试题及答案
- 网络管理员工作中的常见问题试题及答案
- 2025甘肃陕煤集团韩城煤矿招聘250人笔试参考题库附带答案详解
- 2025-2030年中国温泉特色酒店行业市场深度调研及发展趋势与投资前景预测研究报告
- 2025江苏中考:历史高频考点
- 家政合伙合同协议书
- 机械设备产品质量保证承诺书范文
- 《智能安防系统》课件
- 安监考试试题及答案
- SL631水利水电工程单元工程施工质量验收标准第1部分:土石方工程
- DL∕T 5370-2017 水电水利工程施工通 用安全技术规程
- 广东省2024年中考数学试卷【附真题答案】
- (高清版)TDT 1075-2023 光伏发电站工程项目用地控制指标
评论
0/150
提交评论