Android架构分析之JNI
来源:互联网 发布:淘宝发布宝贝要钱吗 编辑:程序博客网 时间:2024/06/09 03:47
作者:刘昊昱
博客:http://blog.csdn.net/liuhaoyutz
Android版本:2.3.7_r1
Linux内核版本:android-goldfish-2.6.29
在我们开始分析Android硬件抽象层HAL之前,我们先来通过一个简单的例子看一下JAVA是怎样通过Java Native Interface(JNI)与C/C++代码进行交互的。
首先我们来编写NativeTest.java,其代码如下:
1public class NativeTest { 2 public native static double max(double a, double b); 3 4 static { 5 System.loadLibrary("max"); 6 } 7 8 public static void main(String[] args) { 9 System.out.println(max(1, 2));10 }11}
第2行,声明max函数是一个native函数,后面由C语言实现。
第5行,导入系统库max,在Linux下,其名称为libmax.so。
第9行,调用max函数,该函数的实现在max库中。
接下来,我们要做的是编译JAVA源码,并且使用javah工具生成一个C头文件。
# javac NativeTest.java
# javah -jni NativeTest
以上两个命令执行完后,当前目录下会生成NativeTest.class和NativeTest.h两个文件。
打开NativeTest.h,其内容如下:
1/* DO NOT EDIT THIS FILE - it is machine generated */ 2#include <jni.h> 3/* Header for class NativeTest */ 4 5#ifndef _Included_NativeTest 6#define _Included_NativeTest 7#ifdef __cplusplus 8extern "C" { 9#endif10/*11 * Class: NativeTest12 * Method: max13 * Signature: (DD)D14 */15JNIEXPORT jdouble JNICALL Java_NativeTest_max16 (JNIEnv *, jclass, jdouble, jdouble);1718#ifdef __cplusplus19}20#endif21#endif
第15-16行,可以看到,该头文件中声明了一个函数Java_NativeTest_max,这就是需要我们在C程序中实现的函数,它对应JAVA代码中调用的max函数。
编写C程序max.c,实现Java_NativeTest_max函数,其代码如下:
1#include "NativeTest.h"2JNIEXPORT jdouble JNICALL Java_NativeTest_max3(JNIEnv * jni_env, jclass class, jdouble a, jdouble b)4{5 return a > b? a: b;6}
Java_NativeTest_max函数的作用是返回两个参数较大的那个。
下面我们需要编译生成动态链接库libmax.so,在编译之前,先配置环境变量:
# export C_INCLUDE_PATH=$C_INCLUDE_PATH:$JAVA_HOME/include
# export C_INCLUDE_PATH=$C_INCLUDE_PATH:$JAVA_HOME/include/linux
# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
编译动态链接库:
# gcc max.c -fPIC -shared -o libmax.so
在当前目录下会生成动态链接库文件libmax.so,执行JAVA程序:
# java NativeTest
2.0
上面的过程就是使用JNI连接JAVA代码与C代码的过程。
- Android架构分析之JNI
- Android架构实例分析之注册hello HAL的JNI方法表
- (OK) Android架构实例分析之注册hello HAL的JNI方法表
- Android架构分析之Android驱动程序开发
- Android 编程技巧之 ----- Android JNI 原理分析
- android JNI 分析:
- Android JNI 分析
- Android JNI原理分析
- Android JNI原理分析
- Android JNI原理分析
- Android JNI原理分析
- Android JNI 分析
- Android架构之从startActivity追踪分析Android系统架构
- Android GPS架构分析之二
- Android架构分析之LOG模块
- Android核心分析之系统架构
- 【架构分析】Android Activity切换之onPause
- Android架构设计之MVP分析
- IPPROTO_IP , IPPROTO_RAW
- C++容器模板在共享内存中的使用
- iphone图片拉伸的几种方法
- 模版和多态策略化加锁模式
- HTML5五大特性
- Android架构分析之JNI
- 获得Android系统所有已安装的应用并联网自动检测升级更新
- 为选择负责。。。
- [已解决]:ORA-12514 TNS:LISTENER DOES NOT CURRENTLY KNOW OF SERVICE REQUESTED IN CONNE
- 十年经历:软件开发的“三重门”
- Linux下安装php的pear和pecl
- 黑马程序员------线程同步方式
- WinCE6.0+S3C6410 USB驱动架构分析
- 什么是 音轨 声道 与 ES TS 关系 通道