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有什么玄机导致我们不能修改和添加文件和函数。后来发现是自己的粗心造成的。

[转]android jni层binder使用/进程通信实例

Recently, I’ve decided to begin my own hardware journey. The most important part is to choose a prop...
  • ilotuo
  • ilotuo
  • 2015年05月28日 14:03
  • 1060

Android使用binder访问service的方式(一)

binder机制是贯穿整个android系统的进程间访问机制,经常被用来访问service,我们结合代码看一下binder在访问service的情形下是怎么具体使用的。 service 你可...
  • xinfuqizao
  • xinfuqizao
  • 2012年07月13日 09:39
  • 36439

Java层Binder使用(ServiceManager)

power = new PowerManagerService(); ServiceManager.addService(Context.POWER_SERVICE, power); contex...
  • jacklam200
  • jacklam200
  • 2014年07月08日 16:48
  • 5803

JNI搭建:native方法注册或NDK中的方法对应

关于JNI的搭建,有两种方式,一种是传统的在C/C++模块入口中提供native方法注册,实例代码如下: view plain/*  * JNI registration.  */  ...
  • bao_jinyu
  • bao_jinyu
  • 2012年05月28日 19:51
  • 8440

ubuntu17.04编译Tiny4412 Android5.0源代码

跟着ubuntu12.04一样,我解开了4412的Android5.0源代码。因为前面这篇文章已经安装了一些开发环境,所以这里不再哆嗦。还是和这篇文章一样的:http://blog.csdn.net/...
  • morixinguan
  • morixinguan
  • 2017年04月16日 13:05
  • 1292

JniHelper详细说明

1.Jni的介绍 先简单介绍一下,Jni简称(Java Native Interface)Java原生接口,在Java里面用Native修饰的方法由另外一种语言实现的本地方法,意思就是说,这个用nat...
  • u013517637
  • u013517637
  • 2016年12月28日 11:14
  • 1514

cocos2d-x中有一个JniHelper类详细使用

主体思路 通过JNI获取java虚拟机,再获取当前程序的JNI环境,通过JNI环境获取需要调用的java类信息,再获取需要调用的java类中的函数信息。再通过JNI环境调用,使用类信息、函数信息...
  • luxiaoyu_sdc
  • luxiaoyu_sdc
  • 2013年11月13日 18:58
  • 26226

[转]android jni层binder使用/进程通信实例

Recently, I’ve decided to begin my own hardware journey. The most important part is to choose a prop...
  • ilotuo
  • ilotuo
  • 2015年05月28日 14:03
  • 1060

Android 面试精华题目总结

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24015867 下面的题目都是楼主在android交流群大家面试时遇到的...
  • wellsoho
  • wellsoho
  • 2015年11月12日 11:33
  • 1449

Android实战技术:理解Binder机制

Android中的RPC(IPC)是由Binder组件来实现的,虽然我们使用更多的还是AIDL,并不会直接使用Binder,但是了解了它能更有效帮助理解AIDL以及理解Android本身的一些原理和机...
  • hitlion2008
  • hitlion2008
  • 2013年08月08日 21:54
  • 15628
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:binder介绍——JNI的架构和实现
举报原因:
原因补充:

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