曹太强的专栏

我从来不定闹钟,因为梦想会把我叫醒

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

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

阅读更多
个人分类: JNI Android 4.0
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭