資源描述:
《Java與C互相調(diào)用》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、AndroidNDK開發(fā)(1)-----Java與C互相調(diào)用實例詳解一、概述對于大部分應(yīng)用開發(fā)者來說可能都不怎么接觸到NDK,但如果涉及到硬件操作的話就不得不使用NDK了。使用NDK還有另一個原因,就是C/C++的效率比較高,因此我們可以把一些耗時的操作放在NDK中實現(xiàn)。所以NDK主要做驅(qū)動的開發(fā)。在java中調(diào)用一個本地方法,然后由該本地方法直接返回一個參數(shù)給java(例如,在java中定義的本地方法為privateintcallJNI(inti))。但在大多數(shù)時候要求的并不是由開發(fā)者在java層主動去調(diào)JNI中的函數(shù)來返回想要的數(shù)據(jù),而是由JNI主動去調(diào)java中的函
2、數(shù)。舉個最簡單的例子,Android中的Camera,圖像數(shù)據(jù)由內(nèi)核一直往上傳到j(luò)ava層,然而這些數(shù)據(jù)的傳遞并不需要開發(fā)者每一次主動去調(diào)用來JNI中的函數(shù)來獲取,而是由JNI主動傳給用java中方法,這類似于Linux驅(qū)動機制中的異步通知。二、要求用NDK實現(xiàn)Java與C/C++互調(diào),實現(xiàn)int,string,byte[]這三種類型的互相傳遞。三、實現(xiàn)下面的實現(xiàn)中,每次java調(diào)用JNI中的某個函數(shù)時,最后會在該函數(shù)里回調(diào)java中相應(yīng)的方法而不是直接返回一個參數(shù)??赡苣銜X得這不還是每次都是由開發(fā)者來主動調(diào)用嗎,其實這只是為了講解而已,在實際應(yīng)用中,回調(diào)java中的方
3、法應(yīng)該由某個事件(非java層)來觸發(fā)。步驟:(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調(diào)用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);//注冊按鈕監(jiān)聽intButton.setOnClickListener(newClickListener());stringButton=(Button)this.findViewById(R.id.stringbutton);//注冊按鈕監(jiān)聽stringButton.setOnClickListener(newClickListener());arrayButton=(Button)this.findVie
7、wById(R.id.arraybutton);//注冊按鈕監(jiān)聽arrayButton.setOnClickListener(newClickListener());intTextView=(TextView)this.findViewById(R.id.inttextview);stringTextView=(TextView)this.findViewById(R.id.stringtextview);arrayTextView=(TextView)this.findViewById(R.id.arraytextview)