`
mfcai
  • 浏览: 409095 次
  • 性别: 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通过JNI访问硬件LED

    在Android系统中,Java Native Interface (JNI) 是一个关键组件,允许Java代码与其他语言(如C++或C)编写的代码进行交互...开发者可以通过学习和实践这个项目,深入了解Android系统的底层工作原理以及JNI的使用技巧。

    android studio jni demo

    Android Studio JNI Demo是一个关于在Android开发环境中使用Java Native Interface(JNI)的实例教程。JNI是Android平台中用于在...通过实践这个Demo,开发者可以深入了解JNI的工作原理,并掌握其在实际项目中的应用。

    Android中JNI测试程序

    Android中的JNI(Java Native Interface)是Java平台提供的一种技术,允许Java代码和其他语言写的代码进行交互。JNI在Android开发中扮演着重要的角色,特别是在需要高效计算、调用系统底层库或者利用硬件特性时。本...

    Android 深入研究JNI详解

    在深入了解JNI(Java Native Interface)之前,我们需要明确一点:Android应用程序的主要部分是基于Java开发的,并且这些Java类会被编译成Dex格式的字节码,然后在Dalvik虚拟机上运行。这种设计模式为Android应用...

    Android Studio JNI 调用demo

    通过分析这个项目,可以更深入地理解JNI的使用方法,包括如何在Android Studio中设置,如何编写C/C++代码,以及如何在Java中调用这些本地方法。 总结,"Android Studio JNI 调用demo"是一个实践教程,旨在帮助...

    Android--JNI-Device.zip_Android jni_android_jni_jni android

    9. **总结**:这个教程资料“Android--JNI-Device.zip”对于希望深入了解Android硬件驱动开发的开发者来说非常有价值,它将帮助开发者学习如何利用JNI高效地与设备驱动进行交互,提高应用程序的性能和功能。

    Android 6.0 AS平台 JNI 实验

    JNI实验可以帮助开发者深入理解Android应用的底层工作原理,同时利用C++等语言提高性能。不过,需要注意的是,过度使用JNI可能导致代码复杂性增加,并可能影响调试和维护。因此,应当谨慎使用,并确保本地代码的...

    Android studio JNI函数以及复杂对象传递

    本篇文章将深入探讨在Android Studio中使用JNI的函数以及如何传递复杂对象。 首先,JNI的核心是通过`JNIEnv`指针来访问Java对象和方法。`JNIEnv`是一个结构体指针,包含了调用Java方法、创建Java对象等一系列接口。...

    android下一个jni方式实现的音频播放

    本示例着重于使用JNI在Android系统中实现音频的播放功能,这是一个深入理解Android NDK(Native Development Kit)和音频处理的好教材。 首先,我们需要了解JNI的基本原理。JNI是Java平台的一部分,它提供了在Java...

    JniCallback.zip_Android jni_android_jni android_jni callback_jni

    在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都非常有用,比如优化性能、使用现有的C/C++库、或者像在这个“JniCallback.zip”文件...

    android-jni.zip_Android jni_android_jni_jni android

    JNI是Java平台标准的一部分,它为Java程序员提供了一个接口,可以编写本地方法(Native Method),这些方法是用非Java语言编写的,如C或C++。在Android中,JNI被广泛用于访问硬件特性、提高计算密集型任务的执行效率...

    android通过JNI控制LED

    在本文中,我们将深入探讨如何通过JNI在Android平台上控制硬件LED(Light Emitting Diode)。LED控制通常用于设备的状态指示或者实现特定的交互效果。 首先,我们需要了解JNI的基本概念。JNI提供了一个框架,使得...

    Qt for Android 用JNI来使C++和Java互调(目前最新版全网只有这个可用)

    在开发跨平台应用程序时,Qt框架提供了一个强大...不过,这需要对Qt、Android以及JNI有深入的理解,以便有效地处理两者之间的交互问题。在实践中,不断学习和调试是必不可少的,因为环境和库的更新可能会带来新的挑战。

    android-JNI

    在“exampleJNI”这个文件中,很可能是作者给出的一个示例项目,包含了一个简单的JNI实现,读者可以通过阅读和运行这个例子来更好地理解上述知识点。这将是一个宝贵的动手实践机会,帮助开发者巩固理论知识并提升...

    android-jni&底层调用开发讲解

    本教程将深入讲解Android的JNI与底层C代码调用的开发过程。 首先,我们要了解JNI的基本概念。JNI是Java平台标准的一部分,它提供了一种方式,使得Java代码能够调用本地(非Java)代码,反之亦然。这使得开发者可以...

    jni.zip_Android jni_android_jni_jni android

    总之,"jni.zip_Android jni_android_jni_jni android"中的"jni.pdf"文档应该详细介绍了如何在Android开发中利用JNI技术,涵盖了从基本概念到实际应用的方方面面,是开发者深入理解并熟练运用JNI的重要参考资料。

    android_jni操作指南.pdf

    根据提供的文件信息,以下是对...综上所述,这份Android JNI操作指南将涵盖如何搭建适合JNI开发的环境,以及通过一个简单示例程序来具体展示Java与C/C++代码之间的交互,对初学者而言是理解和应用JNI的一个入门指导。

    Android_JNI_HIDL

    在Android系统中,JNI(Java Native ...通过学习和实践,开发者可以更深入地理解Android系统的层次结构,以及如何通过JNI和HIDL实现高效、安全的硬件访问。这将有助于你在Android平台上开发高性能的应用和系统服务。

    android jni调用demo

    Android的JNI(Java Native Interface)调用是Android应用开发中的一个重要技术,允许Java代码与本地C/C++代码交互。在Android NDK(Native Development Kit)的帮助下,开发者可以利用C/C++的强大性能处理复杂的...

Global site tag (gtag.js) - Google Analytics