欢迎来到天天文库
浏览记录
ID:40748326
大小:642.50 KB
页数:15页
时间:2019-08-07
《Java与C互相调用》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、AndroidNDK开发(1)-----Java与C互相调用实例详解一、概述对于大部分应用开发者来说可能都不怎么接触到NDK,但如果涉及到硬件操作的话就不得不使用NDK了。使用NDK还有另一个原因,就是C/C++的效率比较高,因此我们可以把一些耗时的操作放在NDK中实现。所以NDK主要做驱动的开发。在java中调用一个本地方法,然后由该本地方法直接返回一个参数给java(例如,在java中定义的本地方法为privateintcallJNI(inti))。但在大多数时候要求的并不是由开发者在java层主动去调JNI中的函数来返回想要的数据,而是由JNI主动去调java中的函
2、数。举个最简单的例子,Android中的Camera,图像数据由内核一直往上传到java层,然而这些数据的传递并不需要开发者每一次主动去调用来JNI中的函数来获取,而是由JNI主动传给用java中方法,这类似于Linux驱动机制中的异步通知。二、要求用NDK实现Java与C/C++互调,实现int,string,byte[]这三种类型的互相传递。三、实现下面的实现中,每次java调用JNI中的某个函数时,最后会在该函数里回调java中相应的方法而不是直接返回一个参数。可能你会觉得这不还是每次都是由开发者来主动调用吗,其实这只是为了讲解而已,在实际应用中,回调java中的方
3、法应该由某个事件(非java层)来触发。步骤:(1)Java类里的声明packagecom.ljt.work;importandroid.annotation.SuppressLint;importandroid.app.Activity;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;importandroid.view.View;importandroid.widget.Button;importandroid.widget.TextView;publicclassLj
4、tndkActivityextendsActivity{//本地方法,由java调用privatenativevoidcallJNIInt(inti);privatenativevoidcallJNIString(Strings);privatenativevoidcallJNIByte(byte[]b);static{//加载本地库System.loadLibrary("myjni");}privateButtonintButton=null;privateButtonstringButton=null;privateButtonarrayButton=null;pri
5、vateTextViewintTextView=null;privateTextViewstringTextView=null;privateTextViewarrayTextView=null;//定义一个处理线程的机制privateHandlermHandler=null;@SuppressLint("HandlerLeak")@OverrideprotectedvoidonCreate(BundlesavedInstanceState){//TODOAuto-generatedmethodstubsuper.onCreate(savedInstanceState);
6、setContentView(R.layout.main);intButton=(Button)this.findViewById(R.id.intbutton);//注册按钮监听intButton.setOnClickListener(newClickListener());stringButton=(Button)this.findViewById(R.id.stringbutton);//注册按钮监听stringButton.setOnClickListener(newClickListener());arrayButton=(Button)this.findVie
7、wById(R.id.arraybutton);//注册按钮监听arrayButton.setOnClickListener(newClickListener());intTextView=(TextView)this.findViewById(R.id.inttextview);stringTextView=(TextView)this.findViewById(R.id.stringtextview);arrayTextView=(TextView)this.findViewById(R.id.arraytextview)
此文档下载收益归作者所有