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

虽然您可以完全使用Java编写应用程序,但有些情况下Java本身并不能满足您的应用程序的需求。当应用程序不能完全用Java编写时,程序员使用JNI编写Java本机方法来处理这些情况。 以下示例说明何时需要使用Java本机方法: 标准Java类库不支持应用程序所需的与平台相关的功能。 您已经有一个用另一种语言编写的库,并希望通过JNI使其可以访问Java代码。 您希望在较低级别的语言(如汇编语言)中实现一小部分时间关键代码。 来源:https://docs.oracle.com/javase/1.5.0/docs/guide/jni/

开发平台

 芯灵思SinlinxA33开发板

淘宝店铺: https://sinlinx.taobao.com/

image

嵌入式linux 开发板交流 641395230

了解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 运行程序 实验现象

转载于:https://my.oschina.net/u/4078822/blog/3013715

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值