15462|0

139

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

芯灵思SinlinxA33开发板的安卓控制LED-2-JNI基础 [复制链接]

虽然您可以完全使用Java编写应用程序,但有些情况下Java本身并不能满足您的应用程序的需求。当应用程序不能完全用Java编写时,程序员使用JNI编写Java本机方法来处理这些情况。
以下示例说明何时需要使用Java本机方法:
  • 标准Java类库不支持应用程序所需的与平台相关的功能。
  • 您已经有一个用另一种语言编写的库,并希望通过JNI使其可以访问Java代码。
  • 您希望在较低级别的语言(如汇编语言)中实现一小部分时间关键代码。
来源:https://docs.oracle.com/javase/1 ... ec/intro.html#wp725
了解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 ;
fully-qualified-class
[ type
type[]
( arg-types ) ret-type
method 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 运行程序实验现象









点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表