2015武大-終端第二天上午_第1頁(yè)
2015武大-終端第二天上午_第2頁(yè)
2015武大-終端第二天上午_第3頁(yè)
2015武大-終端第二天上午_第4頁(yè)
2015武大-終端第二天上午_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

AndroidC、C++開(kāi)發(fā)。眾所周知,AndroidSDK基于Java實(shí)現(xiàn),這意味著基于AndroidSDK進(jìn)行開(kāi)發(fā)的第應(yīng)用都必須使用Java語(yǔ)言。但這并不等同于“第應(yīng)用只能使用Java”。在AndroidSDK首次發(fā)布時(shí),就宣稱其虛擬機(jī)Dalvik支持JNI編程方式,也就是第應(yīng)JNI調(diào)用自己的CAndroid平臺(tái)上,“Java+C”的編程方式是一直都可以實(shí)現(xiàn)不過(guò),也表示,使用原生SDK編程相比Dalvik虛擬機(jī)也有一些劣勢(shì),AndroidSDK文檔里,找不到任何JNI方面的幫助。即使第應(yīng)用開(kāi)發(fā)者使用JNI完成了自己的C動(dòng)態(tài)庫(kù)(so)開(kāi)發(fā),但是無(wú)法FrameworkAPI,Debug難度更大等。開(kāi)發(fā)者需要自行斟酌使用。NDK就應(yīng)運(yùn)而生了。NDKNativeDevelopmentKit持C開(kāi)發(fā)的開(kāi)端。apkjava層代碼很容易被反編譯,而C/C++apk。這些工具對(duì)開(kāi)發(fā)者的幫助是巨大的。mk文件(“哪些文件需要編譯”、“編譯特性要求”等),就可以創(chuàng)建出so。NDKso和Java應(yīng)用一起打包,極大地減輕了開(kāi)發(fā)人員的打包工作。明確該API是穩(wěn)定的,在后續(xù)所有版本中都穩(wěn)定支持當(dāng)前發(fā)布的API。從該版本的NDKAndroid地址:NDK編譯代碼時(shí)必須要用到makegcclinuxcygwin是一個(gè)在windows平臺(tái)上運(yùn)行的unix模擬環(huán)境,它對(duì)于學(xué)習(xí)unix/linuxunix到windows的應(yīng)用InstallfromInternet:直接從Internet上并立即安裝(安裝完成后,好的安裝文件并不會(huì)被刪除,DownloadWithoutInstalling:只是將安裝文件到本地,但暫時(shí)不安裝InstallfromLocalDirectory:不安裝文件,直接從本地某個(gè)含有安裝文件 進(jìn)行安裝 DirectConnectionUseIE5SettingsIEUseHTTP/FTP:使用HTTP或FTP服務(wù)器進(jìn)行連接(需要輸入服務(wù)器地址、端)Search是可以輸入你要的包的名稱,能夠快速篩選出你要的包。那四個(gè)單選按鈕是選擇下邊樹(shù)的樣式,默認(rèn)就行,不用動(dòng)。ViewCategoryfull顯示全部包再查,省的一些包被隱了避免全部,這里列出了后面開(kāi)發(fā)NDK用得著的包:autoconf2.1、automake1.10、binutils、gcc-core、gcc-g++、gcc4-core、gcc4-g++、gdb、pcre、pcre-devel、gawk、make12個(gè)包運(yùn)行cygwin,在彈出令行窗口輸入:cygcheck-ccygwin命令,會(huì)打印出當(dāng)前cygwin的版本和statusokcygwin運(yùn)行正常。然后依次輸入gcc–version,g++--version,make–version,gdb–version進(jìn)試,如果都打印本信息和一些描述信息,則cygwin安裝成功!NDK首先找到cygwin的安裝 ,找到一個(gè)home\<你的用戶名>\.bash_profile文件,我的是:E:\cygwin\home\Administrator\.bash_profile,(注意:我安裝的時(shí)候我的home文件夾下面什么都沒(méi)有,解決的辦法:首先打開(kāi)環(huán)境變量,把里面的用戶變量中的HOME變量刪掉,在E:\cygwin\home文件夾下建立名為Administrator的文件夾(是用戶名),然后把E:\cygwin\etc\skel\.bash_profile拷貝到該文件夾下)。打開(kāi)bash_profile文件,添加NDK=/cygdrive/<你的盤(pán)符>/<android >例如exportNDKcygwincd$NDK/cygdrive/e/android-ndk-r5信息,則表NDK現(xiàn)在我們用安裝好的NDK來(lái)編譯一個(gè)簡(jiǎn)單的程序吧,我們選擇ndk自帶的例子o-jni,我的位于E:\android-ndk-r5\samples\o-jni(根據(jù)你具體的安裝位置而定),運(yùn)行cygwin,輸入命令cd/cygdrive/e/android-ndk-r5/samples/o-jni,進(jìn)入到E:\android-ndk-r5\samples\o-jni 輸入$NDK/ndk-build,執(zhí)行成功后,它會(huì)自動(dòng)生成一個(gè)libs ,把編譯生成的.so文件放在里面。($NDK是調(diào)用我們之前配置好的環(huán)境變量,ndk-build是調(diào)用ndk的編譯程序)此時(shí)去o-jni的 下看有沒(méi)有生成的.so文件,如果有,你的ndk就運(yùn)行正常啦eclipsec/c裝Eclipse的C/C++環(huán)境插件:CDT,這里選擇安裝 錄,找到對(duì)應(yīng)你Eclipse版本的CDT插件的安裝地HelpInstallNewSoftwareAddSelectAlleclispec/cCDTC/C打開(kāi)eclipse,導(dǎo)入ndk自帶的o-jni例子,右鍵單擊項(xiàng)目名稱,點(diǎn)擊Properties,彈出配置BuildersNew,新添加一個(gè)編譯器,點(diǎn)擊后出現(xiàn)添加界面,選擇Program,點(diǎn)擊OK。C_BuilderLocationcygwin安裝路徑>\bin\bash.exe程序,例:E:\cygwin\bin\bash.exe,設(shè)置WorkingDirectory為<你cygwin安裝路徑 ,例如:E:\cygwin\bin,設(shè)置Arguments為--login-c/cygdrive/e/android-ndk-r5/samples/o-jni&&$NDK/ndk-上面的配置中/cygdrive/e/android-ndk-r5/samples/o-jni是你當(dāng)前要編譯的程序的目錄,$NDK是之前配置的ndk的環(huán)境變量,這兩個(gè)根據(jù)你具體的安 變,Arguments這串參數(shù)實(shí)際是給bash.exe命令行程序傳參數(shù),進(jìn)入要編譯的程序 行ndk-build編譯程序RefreshRefreshresourcesuponcompletionBuildOptions之后點(diǎn)擊SpecifyResources按鈕,選擇資 即FinishOK一路把剛才的配置都保存下來(lái),注意:如果你配置的編譯器在其它編譯器下邊,記得一定要點(diǎn)Up按鈕,把它排到第一位,否則C代碼的編譯晚于Java代碼的編譯,會(huì)造成你的C代碼要編譯兩次才能看到的修改 jni.c文件把提示ofromJNI!改成其他的文字:如:o,Mynameisalex.,然后再模擬器中AndroidAndroidNDKdemo程序:o-jni來(lái)達(dá)到這個(gè)目的。1androidNDKlinux下進(jìn)行:因?yàn)樾枰袰/C++arm上運(yùn)行的.so文件,這就需要用到交叉編譯環(huán)境,而交叉編譯需要在linux系統(tǒng)下才能完成。安裝android-ndk開(kāi)發(fā)包,這個(gè)開(kāi)發(fā)包可以在android官網(wǎng):通過(guò)這個(gè)開(kāi)發(fā)包的工androidjniC/C++的代碼編譯成庫(kù)android應(yīng)用程序開(kāi)發(fā)環(huán)境:包括eclipse、javaandroidsdkadtPATH中:sudogedit在environmentPATHandroid-ndk的安裝路勁,然后再讓這個(gè)更改的環(huán)境變source彈出如下的錯(cuò)誤,而不是說(shuō)ndk-buildnotfoundndkAndroidNDK:CouldnotfindapplicationprojectdirectoryAndroidNDK:PleasedefinetheNDK_PROJECT_PATHvariabletopointto/home/braincol/workspace/android/android-ndk-r5/build/core/build-local.mk:85:***AndroidNDK:Aborting .Stop. oJni.javaimportimportimportandroid.widget.TextView;importandroid.os.Bundle;public oJniextends{/**Calledwhentheactivityisfirstcreated.*/publicvoidonCreate(Bundle{ tv=newTextView(this);tv.setText(stringFromJNI());}/*Anativemethodthatisimplementedbythe' o-jni'nativelibrary,whichispackagedwiththisapplication.*/publicnative publicnative /*thisisusedtoloadtheo-jni'libraryonapplicationstartup.libraryhasalreadybeenunpackedbythepackagemanager.*/static{}}o-jni.soatinstallationo-}o-表明程序開(kāi)始運(yùn)行的時(shí)候會(huì)加載o-jni,static區(qū)的代碼會(huì)先于onCreate方法執(zhí)行。如果你的程序中有多個(gè)類,而且如果oJni這個(gè)類不是你應(yīng)用程序的,那么o-jni(完整的名字是libo-jni.so)這個(gè)庫(kù)會(huì)在第一次使用oJni這個(gè)類的時(shí)候加載。publicpublicnativeStringpublicnativeString可以看到這兩個(gè)方法的中有native關(guān)鍵字,這個(gè)關(guān)鍵字表示這兩個(gè)方法是本地方法,也就是說(shuō)這兩個(gè)方法是通過(guò)本地代碼(C/C++)實(shí)現(xiàn)的,在java代碼中僅僅是。用eclipse編譯該工程,生成相應(yīng)的.class文件,這步必須在下一步之前完成,因?yàn)樯?h文件需要用到相應(yīng)的.class文件。C/C++javah這個(gè)工具生成相應(yīng)的.h文件,然后根據(jù)這個(gè).hC/C++代碼。 braincol@ubuntu:~$cdbraincol@ubuntu:~$cd o-o-jni$ o-jni$mkdiro-jni$ o-jni$mkdiro-jni$ o-jni$javah-classpathbin-d -classpathbin-djni:com.example.ojni.oJni則是完整類 下生成了oJni.class的基礎(chǔ)之上?,F(xiàn)在可以看到j(luò)ni 下多了個(gè).h文件:o-jni$cdo-jni/jni$ ojni_oJni.h/*DONOTEDITTHISFILE-itismachinegenerated/*DONOTEDITTHISFILE-itismachinegenerated#include/*Headerforclass#ifdefcplusplusextern"C"{ oJni *Signature:JNIEXPORTjstringJNICALL(JNIEnv*,jobject);*Signature:JNIEXPORTjstring (JNIEnv*,#ifdef}JNIEXPORTJNICALLjniandroid的jni中不需要,當(dāng)然寫(xiě)上去也不會(huì)有錯(cuò)。從上面的源碼中可以看出這個(gè)函數(shù)名那是相當(dāng)?shù)拈L(zhǎng)啊。。。。不過(guò)還是很有規(guī)律的,完全按照:java_pacakege_class_mathod形式來(lái)命名。o.javastringFromJNI()C/C++_example_ojni_oJni_stringFromJNI()方oJni.javaunimplementedStringFromJNI()C/C++_example_ojni_oJni_unimplementedStringFromJNI()方Signature:()Ljava/lang/String;()表示函數(shù)的參數(shù)為空(JNIEnv*,jobject這兩個(gè)參數(shù)之外沒(méi)有其他參數(shù),JNIEnv*jobjectjnijni環(huán)境和對(duì)應(yīng)的java類(或?qū)ο螅┍旧恚琇java/lang/String;表示函數(shù)的返回值是java的String對(duì)象。o-jni.c#include#include#include/*ThisisatrivialJNIexamplewhereweuseanativetoreturnanewVMString.SeethecorrespondingJavafilelocated o-thiz{oJni_stringFromJNI(JNIEnv*env,return(*env)->NewStringUTF(env, ofromJNI} _example_ojni_oJni_unimplementedStringFromJNI方法并沒(méi)有實(shí)現(xiàn),因?yàn)閛Jni.java中只調(diào)用了stringFromJNI()unimplementedStringFromJNI()方法沒(méi)有實(shí)現(xiàn)也沒(méi)關(guān)系,不過(guò)建議最好還是把所有java中定義的本地方法都實(shí)現(xiàn)了,寫(xiě)個(gè)空函數(shù)也行啊。。。有總比沒(méi)有_example_ojni_oJni_stringFromJNI()函數(shù)只是簡(jiǎn)單的返回了一個(gè)內(nèi)容"ofromJNI!"的jstring對(duì)象(對(duì)應(yīng)于javaString對(duì)象)。o-jni.c文件已經(jīng)編寫(xiě)好了,現(xiàn)在可以把com_example_ojni_oJni.h文件給刪了,當(dāng)然留著也行,只是我還是習(xí)慣把不需要的文編譯o-jni.caAndroid.mk在 o-jni.c同 下)新建一個(gè)Android.mk文件,Android.mk文件是makefile#Copyright(C)2009TheAndroidOpenSource#Copyright(C)2009TheAndroidOpenSource##LicensedundertheApacheLicense,Version2.0(the"License");#youmaynotusethisfileexceptincompliancewiththeLicense.#YoumayobtainacopyoftheLicenseat#Unlessrequiredbyapplicablelaworagreedtoinwriting,software#distributedundertheLicenseisdistributedonan"ASIS"BASIS,#WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.#SeetheLicenseforthespecificlanguage erningpermissionsand#limitationsundertheLicense.LOCAL_PATH:=$(callmy-includeLOCAL_SRC_FILESo-o-includeLOCAL_PATH:=$(callmy-一個(gè)Android.mk文件首先必須定義好LOCAL_PATH變量。它用于在開(kāi)發(fā)樹(shù)中查找源文件。在這個(gè)例子中,宏函數(shù)’my-dir’,由編譯系統(tǒng)提供,用于返回當(dāng)前路徑(即包含Android.mkfile文件的 include$(CLEAR_VARS由編譯系統(tǒng)提供,指定讓GNUMAKEFILELOCAL_XXX變量(LOCAL_MODULELOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES,等等LOCAL_PATHLOCAL_MODULE LOCAL_SRC_FILES LOCAL_SRC_FILES變量必須包含將要編譯打包進(jìn)模塊中的CC++源代碼文件。注意,你不用在這C++源碼文件的擴(kuò)展名是’.cpp’.includeBUILD_SHARED_LIBRARYGNUMakefile,負(fù)責(zé)收集自從上次調(diào)用'include$(CLEAR_VARS)'LOCAL_XXX變量中的所有信息,并且決定編譯什么,如何正確地去做。還有BUILD_STATIC_LIBRARY變量表示生成靜態(tài)庫(kù):lib$(LOCAL_MODULE).a,BUILD_EXECUTAB

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論