Android架构分析之JNI

本文通过一个具体的示例详细介绍了如何利用Java Native Interface (JNI)实现Java代码与C/C++代码之间的交互过程。从Java侧声明native方法到C侧的具体实现,再到最终编译链接生成动态库并被Java程序调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:刘昊昱 

博客:http://blog.youkuaiyun.com/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#endif
10/*
11 * Class:     NativeTest
12 * Method:    max
13 * Signature: (DD)D
14 */
15JNIEXPORT jdouble JNICALL Java_NativeTest_max
16  (JNIEnv *, jclass, jdouble, jdouble);
17
18#ifdef __cplusplus
19}
20#endif
21#endif

第15-16行,可以看到,该头文件中声明了一个函数Java_NativeTest_max,这就是需要我们在C程序中实现的函数,它对应JAVA代码中调用的max函数。

编写C程序max.c,实现Java_NativeTest_max函数,其代码如下:

1#include "NativeTest.h"
2JNIEXPORT jdouble JNICALL Java_NativeTest_max
3(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代码的过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值