本博客内容来自《深入理解android卷一》
android分为三层:java层,JNI层,Native层
这里以MediaScanner为例:
java层:
public class MediaScanner { staic{ System.loadLibrary("media_jni"); native_init();//调用native_init函数 } ... public void scanDirectories(String[] directories,String volumnName){ ...... } //申明一个native函数。native为java的关键字,表示它将由jni层完成 private static native final void native_init(); private native void processFile(String path,String mimeType,MediaScannerClient client); }
JNI层:
代码位置:android_media_MediaScanner.cpp
static void android_media_MediaScanner_native_init(JNIEnv *env) { jclass clazz; clazz = env->FindClass("android/media/MediaScanner");//java层文件代码路径 ... fields.context = env->GetFieldID(clazz,"mNativeContext","I"); ... return; } //这个函数是processsFile的JNI层实现 static void android_media_MediaScanner_processFile(JNIEnv *env,jobject thiz,jstring path,jstring mimetype,jobject client){ MediaScanner *mp = (MediaScanner *)env->GetIntField(thiz,fields.contenxt); ... const char *pathStr = env->GetStringUTFChars(path,NULL); ... if(mimeType){ env->ReleaseStringUTFChars(mimeType,mimeTypeStr); } }
问题:native_init();层如何知道android_media_MediaScanner_native_init的位置
android.media.MediaScanner.native_init换算成android_media_MediaScanner_native_init
答:一共有两种方式注册
1、静态方法
先编写JAVA代码,然后编译生成.class文件
使用javah -o output packagename.classname生成的output.h文件中,就申明了JNI函数
2、动态注册
在libmedia_jni.so实现JNI_OnLoad
jclass clazz = (*env)->FindcClass(env,className);
(*env)->RegisterNatives(env,clazz,gMethods,numMethods);
jint JNI_OnLoad(JavaVm *vm,void * reserved)
{
JNI
}
相关推荐
深入理解Android 卷1 不是扫描版的,是全版电子书的,非PDF,可编辑,各种阅览器以打开!包括书签和同步目录! 第1章 阅读前的准备工作 / 1 1.1 系统架构 / 2 1.1.1 Android系统架构 / 2 1.1.2 本书的架构 / 3 1.2 ...
一本以情景方式对Android的源代码进行深入分析的书。内容广泛,以对Framework层的分析为主,兼顾Native层和Application层;...通过对本书的学习,大家将能更深刻地理解Android系统,从而自如应对实际开发中遇到的难题
根据提供的文件信息,下面详细阐述了《深入理解Android:卷三》中部分章节的知识点: 标题:“深入理解Android:卷三” 描述:“第一章:开发环境部署” 知识点: 开发环境部署是进行Android应用开发之前的准备工作...
深入理解Android:卷2》是一本以情景方式对Android的源代码进行深入分析的书。内容广泛,以对Framework层的分析为主,兼顾Native层和Application层;分析深入,每一部分源代码的分析都力求透彻;针对性强,注重实际...
1. **第一章:准备工作** - Android 4.0源码的下载与编译 - Eclipse开发环境的搭建 - Android系统进程(system_process)的调试技巧 2. **第二章:Java Binder与MessageQueue** - Java Binder机制的深入分析 ...
深入理解Android:卷I》是一本以情景方式对Android的源代码进行深入分析的书。内容广泛,以对Framework层的分析为主,兼顾Native层和Application层;分析深入,每一部分源代码的分析都力求透彻;针对性强,注重实际...
- **本章小结**:对第一章所讲的内容进行了概括性总结,强调了搭建好开发环境对于深入研究Android系统的重要性。 #### 第2章:深入理解JavaBinder和MessageQueue - **Java层中的Binder架构分析**: - **Binder...
《深入理解Android:Wi-Fi、NFC和GPS卷》是一本全面覆盖Android平台上三大关键模块的专业书籍,不仅适合Android系统工程师、应用开发工程师和BSP开发工程师阅读,也为那些希望深入了解移动通信技术的读者提供了宝贵...
深入理解Android:卷I(51CTO网站“2011年度最受读者喜爱的原创IT技术图书”) 基本信息 作者: 邓凡平 出版社:机械工业出版社 ISBN:9787111357629 上架时间:2011-9-13 出版日期:2011 年9月 开本:16开 页码:488...
"深入理解Android(卷I)"是一个系列教程,旨在帮助开发者建立起对Android操作系统深层次的理解。 首先,我们来谈谈"源码"这个标签。在Android开发中,源码分析是一个重要的环节,因为通过阅读源码,开发者可以更深入...
《深入理解Android:Telephony原理剖析与最佳实践》为经典畅销书“深入理解Android”系列新作,从源码角度深入解析Telephony的架构设计与实现原理,深刻揭示Android系统的通信机制! 本书是“深入理解Android”系列...
### 深入理解Android卷II 第7章:ContentProvider #### 一、ContentProvider概述与原理 在Android系统中,ContentProvider作为一种重要的组件之一,主要用于处理应用间的数据共享问题。它提供了一套标准接口来访问...
《深入理解Android卷 III》是Android开发者们的重要参考资料,它深度剖析了Android系统的内部机制。在这一卷中,第四章的SampleWindow是一个关键的概念,它为我们揭示了Android窗口管理的奥秘。SampleWindow是一个...
在Android软件安全与逆向分析的第五...这一章的内容旨在帮助读者建立对Android应用安全性的全面理解,并掌握逆向分析的基本技能。无论是为了开发更安全的应用,还是为了检测和防御恶意软件,这些知识都将提供宝贵指导。