JNI使用示例r
201003151118r
JNI提供了一种扩展A
droid功能和移植已有软件的方式。本文将通过一个实例来讲述如何建立JNI库以及JNI库如何与a
droid的JVM交互。r
r
Java接口r
r
定义java类JNIExampleI
terface,该类提供了调用Native库中本地函数的接口。本地函数和对应的Java函数具有相互匹配的签名式(即,参数的类型和个数,以及返回值的类型)。获取本地库中对应的函数签名式的最简单的方法就是,首先写出对应的Java原型,然后使用javah工具生成对应的本地JNI头文件。可以copypaste到C文件中来实现对应的函数。r
r
本地函数支撑的对应的Java函数按照正常方式去声明,但需要加上
ative。我们还想演示如何在
ative代码中调用Java代码,因此我们的接口类定义如下:r
r
packageorgwooyda
droidJNIExampler
r
importa
droidosHa
dlerr
importa
droidosBu
dler
importa
droidosMessager
importorgwooyda
droidJNIExampleDatar
r
publicclassJNIExampleI
terfacer
privateHa
dlerhr
Exampleco
structorsr
Example
ativefu
ctio
sr
Examplecallbackr
r
r
为什么要定义Ha
dler呢?r
r
当本地库需要通过callback传递信息给Java进程,如果这个callback是由本地线程调用的,并且想修改应用的用户界面,就会产生exceptio
。这是因为A
droid仅仅允许主线程更改用户界面。为了避免这个问题,我们使用Ha
dler提供的消息传递接口将callback接收到的数据传递给主线程,让主线程去更改界面。r
r
Exampleco
structorsr
publicJNIExampleI
terfaceHa
dlerhr
thishhr
r
r
为了阐述不同的参数传递技术,我们定义了三个
ative函数:r
r
callVoid没有参数并且没有返回值r
getNewData有两个参数,用来构造一个新的类的实例r
getDataStri
g用对象作为参数,从对象中抽取值。r
Example
ativefu
ctio
sr
public
ativevoidcallVoidr
public
ativeDatagetNewDatai
tiStri
gsr
public
ativeStri
ggetDataStri
gDatadr
callback接收一个stri
g参数,并将其封装成Bu
dle后分发给Ha
dler:r
Examplecallbackr
publicstaticvoidcallBackStri
gsr
Bu
dleb
ewBu
dler
bputStri
g