您现在的位置是:首页 > 文章详情

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

日期:2019-02-21点击:374

虽然您可以完全使用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 Type Native Type Description
boolean jboolean unsigned 8 bits
byte jbyte signed 8 bits
char jchar unsigned 16 bits
short jshort signed 16 bits
int jint signed 32 bits
long jlong signed 64 bits
float jfloat 32 bits
double jdouble 64 bits
void void N/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 Signature Java Type
Z boolean
B byte
C char
S short
I int
J long
F float
D double
L fully-qualified-class
[ type type[]

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://yq.aliyun.com/articles/691140
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章