欢迎来到天天文库
浏览记录
ID:51794600
大小:28.82 KB
页数:13页
时间:2020-03-15
《利用JNI来实现android与SO文件的交互.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、利用JNI来实现android与SO文件的交互。该文档主要演示了android中如何与so文件进行交互。即现在的问题需要硬件厂商重新开发动态库,并按照全网物联生成的.h文件进行开发动态库。1、总体步骤为A、写好native本地java类B、生成.h文件。C、硬件厂商按.h文件开发动态库soD、Android中采用system.loadLib(‘*.so’)。E、调用本地native方法。全网物联研发人员需要用Handler独立进程去调用,不然会有问题。F、驱动硬件。2、教程:JNI提供了一种扩展Android功能和移植已有软件的方式。本文将通过一个实
2、例来讲述如何建立JNI库以及JNI库如何与android的JVM交互。Java接口定义java类JNIExampleInterface,该类提供了调用Native库中本地函数的接口。本地函数和对应的Java函数具有相互匹配的签名式(即,参数的类型和个数,以及返回值的类型)。获取本地库中对应的函数签名式的最简单的方法就是,首先写出对应的Java原型,然后使用javah工具生成对应的本地JNI头文件。可以copy/paste到C++文件中来实现对应的函数。本地函数支撑的对应的Java函数按照正常方式去声明,但需要加上native。我们还想演示如何在nat
3、ive代码中调用Java代码,因此我们的接口类定义如下:packageorg.wooyd.android.JNIExample;importandroid.os.Handler;importandroid.os.Bundle;importandroid.os.Message;importorg.wooyd.android.JNIExample.Data;publicclassJNIExampleInterface{privateHandlerh;4、callback>}为什么要定义Handler呢?当本地库需要通过callback传递信息给Java进程,如果这个callback是由本地线程调用的,并且想修改应用的用户界面,就会产生exception。这是因为Android仅仅允许主线程更改用户界面。为了避免这个问题,我们使用Handler提供的消息传递接口将callback接收到的数据传递给主线程,让主线程去更改界面。publicJNIExampleInterface(Handlerh){this.h=h;}为了阐述不同的参数传递技术,我们定义了三个na5、tive函数:callVoid():没有参数并且没有返回值;getNewData():有两个参数,用来构造一个新的类的实例;getDataString():用对象作为参数,从对象中抽取值。publicnativevoidcallVoid();publicnativeDatagetNewData(inti,Strings);publicnativeStringgetDataString(Datad);callback接收一个string参数,并将其封装成Bundle后分发给Handler:6、callback>publicstaticvoidcallBack(Strings){Bundleb=newBundle();b.putString("callback_string",s);Messagem=Message.obtain();m.setData(b);m.setTarget(h);m.sendToTarget();}另外我们定义一个Datadummy类Data.javapackageorg.wooyd.android.JNIExample;publicclassData{publicinti;publicStrings;public7、Data(){}publicData(inti,Strings){this.i=i;this.s=s;}}编译Data.java和JNIExampleInterface.java$javacorg/wooyd/android/JNIExample/*.java生成JNI头文件,包含与Java对应的本地函数的原型$javah-classpath.org.wooyd.android.JNIExample.JNIExampleInterface本地库的实现,这个地方就需要全网物联把这个.H文件给硬件厂商了,硬件厂商需要按照这个文件开发动态库。函数名必须一致8、。<
4、callback>}为什么要定义Handler呢?当本地库需要通过callback传递信息给Java进程,如果这个callback是由本地线程调用的,并且想修改应用的用户界面,就会产生exception。这是因为Android仅仅允许主线程更改用户界面。为了避免这个问题,我们使用Handler提供的消息传递接口将callback接收到的数据传递给主线程,让主线程去更改界面。publicJNIExampleInterface(Handlerh){this.h=h;}为了阐述不同的参数传递技术,我们定义了三个na
5、tive函数:callVoid():没有参数并且没有返回值;getNewData():有两个参数,用来构造一个新的类的实例;getDataString():用对象作为参数,从对象中抽取值。publicnativevoidcallVoid();publicnativeDatagetNewData(inti,Strings);publicnativeStringgetDataString(Datad);callback接收一个string参数,并将其封装成Bundle后分发给Handler:6、callback>publicstaticvoidcallBack(Strings){Bundleb=newBundle();b.putString("callback_string",s);Messagem=Message.obtain();m.setData(b);m.setTarget(h);m.sendToTarget();}另外我们定义一个Datadummy类Data.javapackageorg.wooyd.android.JNIExample;publicclassData{publicinti;publicStrings;public7、Data(){}publicData(inti,Strings){this.i=i;this.s=s;}}编译Data.java和JNIExampleInterface.java$javacorg/wooyd/android/JNIExample/*.java生成JNI头文件,包含与Java对应的本地函数的原型$javah-classpath.org.wooyd.android.JNIExample.JNIExampleInterface本地库的实现,这个地方就需要全网物联把这个.H文件给硬件厂商了,硬件厂商需要按照这个文件开发动态库。函数名必须一致8、。<
6、callback>publicstaticvoidcallBack(Strings){Bundleb=newBundle();b.putString("callback_string",s);Messagem=Message.obtain();m.setData(b);m.setTarget(h);m.sendToTarget();}另外我们定义一个Datadummy类Data.javapackageorg.wooyd.android.JNIExample;publicclassData{publicinti;publicStrings;public
7、Data(){}publicData(inti,Strings){this.i=i;this.s=s;}}编译Data.java和JNIExampleInterface.java$javacorg/wooyd/android/JNIExample/*.java生成JNI头文件,包含与Java对应的本地函数的原型$javah-classpath.org.wooyd.android.JNIExample.JNIExampleInterface本地库的实现,这个地方就需要全网物联把这个.H文件给硬件厂商了,硬件厂商需要按照这个文件开发动态库。函数名必须一致
8、。<
此文档下载收益归作者所有