全志A33开发板的安卓控制LED-2-JNI基础

本文深入解析Java Native Interface (JNI),探讨其在Java与本地代码交互中的作用。解释了何时及为何需要使用JNI,包括处理平台相关功能、整合现有库以及优化性能关键代码。详细介绍了JNI函数的语法、调用规则及数据类型转换,展示了如何通过JNI实现Java与C/C++的无缝连接。

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

虽然您可以完全使用Java编写应用程序,但有些情况下Java本身并不能满足您的应用程序的需求。当应用程序不能完全用Java编写时,程序员使用JNI编写Java本机方法来处理这些情况。
以下示例说明何时需要使用Java本机方法:

标准Java类库不支持应用程序所需的与平台相关的功能。
您已经有一个用另一种语言编写的库,并希望通过JNI使其可以访问Java代码。
您希望在较低级别的语言(如汇编语言)中实现一小部分时间关键代码。
来源:https://docs.oracle.com/javase/1.5.0/docs/guide/jni/

开发平台

 芯灵思SinlinxA33开发板

image

了解JNI函数

JNI函数就是在native层定义的本地函数,对应于在java层使用native关键字声明的方法的。直白的说,就是在Java层声明,C/C++语言实现的。当然,这个函数并不一般,它会通过JNI某种机制与Java层的方法进行关联,使得Java层代码可以很方便的调用它。

jni函数的语法和调用规则

  • 将java语言的数据类型转换成底层语言调用规则
  • 将java语言的方法调用转换成底层语言函数或方法
jni数据类型的转化

jni在java和C之间建立连接,因此jni首先要统一两者的数据类型

Java TypeNative TypeDescription
booleanjbooleanunsigned 8 bits
bytejbytesigned 8 bits
charjcharunsigned 16 bits
shortjshortsigned 16 bits
intjintsigned 32 bits
longjlongsigned 64 bits
floatjfloat32 bits
doublejdouble64 bits
voidvoidN/A

The following definition is provided for convenience.

define JNI_FALSE 0 #define JNI_TRUE 1

The jsize integer type is used to describe cardinal indices and sizes:
typedef jint jsize;

  • java中可以直接调用底层语言的函数,jni规定了java调用底层语言的方法签名
  • java中有重载概念,所以java方法转换成签名,签名再转化为函数
Type SignatureJava Type
Zboolean
Bbyte
Cchar
Sshort
Iint
Jlong
Ffloat
Ddouble
Lfully-qualified-class
[ typetype[]

For example, the Java method:
long f (int n, String s, int[] arr);
has the following type signature:
(ILjava/lang/String;[I)J

jni机制实现

native 声明的函数可以不实现
class Cls { 
     native double f(int i, String s);                 // 声明为本地方法
     static { 
         System.loadLibrary(“库名”);         // 通过静态初始化语句块来加载动态库
     } 
} 

程序实现测试java代码

javah -jni Hello 生成Hello .h

打开Hello .h 文件里面已经写好C函数的名字
C代码

将C文件制做成共享库.so,注意指定jni.h和jni_md.h文件路径

gcc -shared -fPIC hello.c -o libhello.so -I /usr/java/jdk1.6.0_45/include/ -I /usr/java/jdk1.6.0_45/include/linux/

java Hello 运行程序
实验现象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值