作者:刘昊昱

博客: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代码的过程。

更多相关文章

  1. cocos2d-x学习之旅(四):1.4 使用eclipse编译Android(安卓)C++
  2. android沉浸式状态栏
  3. android中用Spannable在TextView中设置超链接、颜色、字体
  4. android通用文件操作
  5. android 为摄像头增加闪光灯(s5pv210)
  6. Conversion to Dalvik format failed: Unable to execute dex: n
  7. dex.force.jumbo和Java heap space的问题
  8. Android(安卓)APK反编译详解(附图)
  9. 箭头函数的基础使用

随机推荐

  1. Android(安卓)ADT 离线下载技巧(告别在线
  2. ANDROID:LISTVIEW 自定义背景
  3. Android(安卓)Studio项目中使用 AndroidX
  4. Android在线更新SDK的方法(使用国内镜像)
  5. Android调用OpenGL绘制曲线入门手册
  6. ROS(indigo) turtlebot2 + android一些有
  7. android view 原理 -- measure 分析与应
  8. Android(安卓)Theme主题样式开发注意点
  9. Android编译系统简要介绍和学习计划
  10. Android(安卓)SparseArray与HashMap与Arr