binder介绍——JNI的架构和实现

原创 2012年03月21日 10:57:03

首先介绍一下JNI设计的目的:

JNI是Java Native Interface的缩写:

    The standard Java class library may not support the platform-dependent features needed by your application.

   You may already have a library or application written in another programming language and you wish to make it accessible to Java applications

    you may want to implement a small portion of time-critical code in a lower-level programming language,such as assembly, and then have your Java application call these functions.

Android系统中使用JNI原因

Android上层使用Java语言来开发应用程序,而且在Android系统架构图中可以看到,Android  framework层也都是向应用开发者提供Java API,但是所有的本地库都使用了C/C++来实现,这就需要使用JNI方式向Java提供接口,是java层的接口能调用本地的具体实现。

JNI架构

Android  framework层中的API大部分调用了native方法,这些方法也都由本地代码来实现,然后注册到系统中。注册过程需要使用Dalvik中的一个工具库nativehelper,该库的主要用于注册Java本地调用的函数(即通过JNI方式向上层提供接口)。

实现nativehelper库的源代码位于“dalvik\libnativehelper”目录中,最终将被编译为libnativehelper.so动态链接库。通常使用JNI方式时需要使用该库,其主要头文件如下:

dalvik\libnativehelper\include\nativehelper\jni.h(基于JNI标准的头文件)

dalvik\libnativehelper\include\nativehelper\JNIHelper.h(提供JNI注册功能的头文件)

具体的JNI代码的实现主要位于frameworks\base\core\jni\目录中,实现了Android API的大部分功能,最终将被编译为libandroid_runtime.so动态链接库,放置在out目录下的\system\lib目录中。

JNI的实现

实际上JNI需要实现的主要内容有两个:首先将java、代码中声明的原生方法在本地注册。然后注册到系统中。

Q:

在我们编写JNI的时候,很有可能导致系统启动的过程中,启动失败。分析主要的原因有两个方面:一是我们找不到class,另一种是我们找不到nativemethod。这两种情况都是我们在编写文件的时候的java和cpp的函数或者路径名称不匹配造成的。因此在此种情况下我们一定要仔细检查一边。此前出现问题的时候,我还白白的认为是android有什么玄机导致我们不能修改和添加文件和函数。后来发现是自己的粗心造成的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

SmartJNI —— 更简洁更高效的JNI接口封装

引入       平时我们在android NDK开发过程中,碰到最多的情况就是通过JNI回调java的API。JNI可以理解为java反射框架的本地版本。JNI所提供的原生接口,如果需要通过反射获...

Android平台上的JNI技术介绍

http://liuyix.org/blog/2013/android-ndk-and-jni-introduction/ NDK简介 Android是由Google领...

linux内存操作--ioremap和mmap学习笔记

最近在做视频输出相关的东西,对于预留给framebuffer的内存使用不是很清楚,现在找到一些资料整理一下,以备使用。 对于一个系统来讲,会有很多的外设,那么这些外设的管理都是通过CPU完成。那么CP...

mjpg-streamer

原文:http://sourceforge.net/apps/mediawiki/mjpg-streamer/index.php?title=Main_Pages (2011/05/15)   ...

uvc摄像头代码解析

USB描述符介绍

uvc摄像头代码解析7

13.uvc视频初始化 13.1 uvc数据流控制 [cpp  struct uvc_streaming_control {       __u16 bmHint;   ...

Linux USB Gadget--设备枚举

前面介绍了Linux USB Gadget的软件结构与各软件层的整合过程。经过各种注册函数,Gadget功能驱动层,USB设备层与UDC底层结合在了一起形成了一个完整的USB设备。而这个设备已经准备好...

linux USB 摄像头 驱动 移植,使用

USB摄像头驱动的移植 原文地址: http://blog.csdn.net/woshidahuaidan2011/article/details/52055057 1、US...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)