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

深入了解android平台的jni(一),第1张

概述    android中很多Java类都具有native接口,这些接口由本地实现,然后注册到系统中。主要的JNI代码放在以下的路径中:frameworks/base/core/jni/,这个路径中的内容被编译成库libandroid_runtime.so,被放置在目标系统的/system/lib目录下。此外,android还有其他的JNI库。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.1查找该类:

jclass xxx = (*env)->FindClass(env, “Lclass_name;”);

1.2取得方法的ID:

jmethodID xxx = (*env)->getmethodID(env, jclass, methodname, “(M)N”);

1.3查找需要调用的该类的方法:

jmethodID xxx = (*env)->getmethodID(env, jclass, “(M)N” );

1.4取得静态方法的ID

jmethodID xxx = (*env)->GetStaticmethodID(env,jclass, methodname,“(M)N”)

1.5初始化该类的实例:

jobject xxx = (*env)->NewObject(env, jclass, jmethodID );

1.6调用实例的某方法:

(*env)->CallObjectMethod(env, jobject, jmethodID, [parameter1, parameter2,…] );

1.7释放实例:

(*env)->DeleteLocalRef(env, xxx);

1.8取得成员变量的ID

jfIEldID xxx = (*env)->GetFIEldID(env,jclass ,jfIEldID,jfIEldTyp 大专栏  深入了解android平台的jni(一)e)

1.9取得静态成员变量的ID

jfIEldID xxx = GetStaticFIEldID(env,jclass ,jfIEldID,jfIEldType)jnienv - java的运行环境jobject - 代表java的instancejclass - 代表java的类

2、函数与属性签名

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

3、JNI 类型签名

       “(M)N”,这里的M和N指的是该函数的输入和输出参数的类型签名(Type Signature)。具体的每一个字符的对应关系如下:

字符–java类型–C类型V–voID–voIDZ–jboolean–booleanI–jint–intJ–jlong–longD–jdouble–doubleF–jfloat–floatB–jbyte–byteC–jchar–charS–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

总结

以上是内存溢出为你收集整理的深入了解android平台的jni(一)全部内容,希望文章能够帮你解决深入了解android平台的jni(一)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1092880.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存