`
mfcai
  • 浏览: 404707 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

深入了解android平台的jni(一)

阅读更多
android中很多Java类都具有native接口,这些接口由本地实现,然后注册到系统中。    
主要的JNI代码放在以下的路径中:frameworks/base/core/jni/,这个路径中的内容被编译成库 libandroid_runtime.so,被放置在目标系统的/system/lib目录下。此外,android还有其他的 JNI库。JNI中的各个文件,实际上就是普通的C++源文件.
如果要深入了解android framework层,则必须Android Native层运行及开发机制.
这里先介绍一些native的基础知识

1、接口定义
_JNIEnv定义了一个虚拟机的接口,通过这个接口可以访问虚拟机的所有功能:
1)分配对象(AllocObject/NewObject),并且控制对象的引用计数(NewGlobalRef/DeleteGlobalRef/DeleteLocalRef/IsSameObject/NewLocalRef)。
2)获取类的定义(FindClass),并通过类的定义来获取获取类得方法和成员的ID(GetMethodID/GetFieldID)
3)通过方法ID调用类的普通方法(CallObjectMethod)和静态方法(CallStaticObjectMethod)
4)通过成员ID获取和设置类的普通成员(GetObjectField/SetObjectField)和静态成员(GetStaticObjectField/SetStaticObjectField)
下面是比较常用的方法:
1)查找该类:
   jclass xxx = (*env)->FindClass(env, "Lclass_name;");
2)取得方法的id:
   jmethodID xxx = (*env)->GetMethodID(env, jclass, methodName, "(M)N");
3)查找需要调用的该类的方法:
   jmethodID xxx = (*env)->GetMethodID(env, jclass, "(M)N" );
4)取得静态方法的id
   jmethodID  xxx = (*env)->GetStaticMethodID(env,jclass, methodName,"(M)N")
5)初始化该类的实例: 
   jobject xxx = (*env)->NewObject(env, jclass, jmethodID );
6)调用实例的某方法:
   (*env)->CallObjectMethod(env, jobject, jmethodID, [parameter1, parameter2,...] );
7)释放实例:
   (*env)->DeleteLocalRef(env, xxx);
8)取得成员变量的id
   jfieldID xxx = (*env)->GetFieldID(env,jclass ,jfieldID,jfieldType)
9)取得静态成员变量的id
   jfieldID xxx = GetStaticFieldID(env,jclass ,jfieldID,jfieldType)
JNIENV - java的运行环境
jobject - 代表java的instance
jclass - 代表java的类


2、函数与属性签名
在GetMethodID和GetFieldID这两个函数中,最后一个参数都是签名字符串,用来标示java函数和成员的唯一性。
因为java中存在重载函数,所以一个函数名不足以唯一指定一个函数,这时候就需要签名字符串来指定函数的参数列表和返回值类型了。
函数签名是一个字符串:"(M)N"
括号中的内容是函数的参数类型,括号后面表示函数的返回值。



3、JNI 类型签名
"(M)N",这里的M和N指的是该函数的输入和输出参数的类型签名(Type Signature)。
具体的每一个字符的对应关系如下
字符 Java类型     C类型
V      void       void
Z    jboolean    boolean
I      jint        int
J      jlong      long
D     jdouble     double
F    jfloat       float
B    jbyte        byte
C    jchar        char
S    jshort       short
数组则以”["开始,用两个字符表示
[I   jintArray    int[]
[F   jfloatArray  float[]
[B   jbyteArray   byte[]
[C   jcharArray   char[]
[S   jshortArray  short[]
[D   jdoubleArray double[]
[J   jlongArray   long[]
[Z  jbooleanArray boolean[]
如果Java函数的参数是class,则以”L”开头,以”;”结尾,中间是用”/” 隔开的包及类名。而其对应的C函数名的参数则为jobject
一个例外是String类,其对应的类为jstring
Ljava/lang/String; String jstring
Ljava/net/Socket; Socket jobject
如果JAVA函数位于一个嵌入类,则用$作为类名间的分隔符。
例如 “(Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z”
举例说明"(M)N"的含义,例如:
(I)V   带一个int 类型的参数,返回值类型为void
()D     没有参数,返回double

本文欢迎转载,但请注明作者与出处:
作者:流星
出处:http://blog.sina.com.cn/staratsky
分享到:
评论

相关推荐

    《深度理解Android:第一卷》

    《深入理解Android:卷I》是一本以情景方式对Android的源代码进行深入分析的书。内容广泛,以对Framework层的分析为主,兼顾Native层和Application层;分析深入,每一部分源代码的分析都力求透彻;针对性强,注重...

    《深入理解Android》卷Ⅰ

    第2章 深入理解JNI 2.1 JNI概述 2.2 学习JNI的实例:MediaScanner 2.3 Java层的MediaScanner分析 2.3.1 加载JNI库 2.3.2 Java的native函数和总结 2.4 JNI层MediaScanner的分析 2.4.1 注册JNI函数 2.4.2 数据类型转换...

    深入理解Android卷1全

    深入理解Android 卷1 不是扫描版的,是全版电子书的,非PDF,可编辑,各种阅览器以打开!包括书签和同步目录! 第1章 阅读前的准备工作 / 1 1.1 系统架构 / 2 1.1.1 Android系统架构 / 2 1.1.2 本书的架构 / 3 1.2 ...

    深入理解Android++卷1pdf电子书

    《深入理解Android(卷1)》是一本以情景方式对Android的源代码进行深入分析的书。内容广泛,以对Framework层的分析为主,兼顾Native层和Application层;分析深入,每一部分源代码的分析都力求透彻;针对性强,注重...

    深入理解Android:卷2

    深入理解Android:卷2》是一本以情景方式对Android的源代码进行深入分析的书。内容广泛,以对Framework层的分析为主,兼顾Native层和Application层;分析深入,每一部分源代码的分析都力求透彻;针对性强,注重实际...

    深入理解Android卷1

    深入理解Android:卷I》是一本以情景方式对Android的源代码进行深入分析的书。内容广泛,以对Framework层的分析为主,兼顾Native层和Application层;分析深入,每一部分源代码的分析都力求透彻;针对性强,注重实际...

    深入理解Android 卷1.pdf

    一本以情景方式对Android的源代码进行深入分析的书。内容广泛,以对Framework层的分析为主,兼顾Native层和Application层;...通过对本书的学习,大家将能更深刻地理解Android系统,从而自如应对实际开发中遇到的难题

    《深入理解Android:卷I》试读本

    《深入理解Android:卷I》是一本以情景方式对Android的源代码进行深入分析的书。内容广泛,以对Framework层的分析为主,兼顾Native层和Application层;分析深入,每一部分源代码的分析都力求透彻;针对性强,注重实际...

    深入理解Android:卷I--详细书签版

     《深入理解android:卷1》是一本以情景方式对android的源代码进行深入分析的书。内容广泛,以对framework层的分析为主,兼顾native层和application层;分析深入,每一部分源代 码的分析都力求透彻;针对性强,...

    深入解析ANDROID虚拟机

    本书十三个章节,分别讲解了android系统基础知识,android系统的结构和核心框架,Java虚拟机和Dalvik虚拟机的知识,实现程序编译和调试,Dalvik的运作流程,DEX优化和安全管理,Android虚拟机生命周期的管理和内存...

    基于AndroidO平台JNI机制的学习

    本文档是笔者个人针对系统androidO源码,参考《深入理解安卓卷一》的基础上,将案例MediaScanner的JNI通信整个流程进行了梳理,全文结构按照从上到下的结构进行了分析与总结。

    深入理解Android 卷I

     《深入理解android:卷1》是一本以情景方式对android的源代码进行深入分析的书。内容广泛,以对framework层的分析为主,兼顾native层和application层;分析深入,每一部分源代码的分析都力求透彻;针对性强,注重...

    深入理解Android重难点

    邓凡平老师的深入理解Android系列教程,进阶开发,建议了解一下。包含JNI,init,Binder,Surface等重难点分析

    Android JNI详解,让你彻底了解JNI (上)

    Android开发中,随着对移动程序的安全性、性能等方面的重视,JNI技术也越发重要。如今,多数企业在招聘中、高级程序员时,...后面两部分课程,将带领大家深入了解JNI交互原理,Native实战开发,让你真正掌握JNI技术。

    深入理解Android

    本书是一本以情景方式对Android的源代码进行深入分析的书。内容广泛,以对Framework层的分析为主,兼顾Native层和...通过对本书的学习,大家将能更深刻地理解Android系统,从而自如应对实际开发中遇到的难题。

    Android JNI加密项目,目前集合DES,AES两种加密算法.zip

    学习者可以通过实际操作,深入了解Android开发的整个流程,提升自己的实战能力。 此外,我们还提供了一系列练习题,旨在巩固所学知识,检验学习成果。这些练习题既有基础题,也有难度较高的挑战题,适合不同层次的...

    android JNI 编程

    这个对想深入了解android的tongxue有帮助,有利于底层开发

    jni开发demo:通过jni将一张彩色图片转换为黑白图片

    通过jni将一张彩色图片转换为黑白图片,通过这个demo,可以深入了解jni的应用

Global site tag (gtag.js) - Google Analytics