关闭

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

标签: jnijavaandroidframeworksapplicationlibrary
6182人阅读 评论(0) 收藏 举报
分类:

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

2
2

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:467038次
    • 积分:5149
    • 等级:
    • 排名:第5335名
    • 原创:93篇
    • 转载:2篇
    • 译文:2篇
    • 评论:69条
    个人声明
    谨此声明:本人目前的博客内容还有点混乱,但是本人在不断的修正中。
    最新评论