2021-10項目開發(fā)基礎(chǔ)jni與底層調(diào)用android_第1頁
2021-10項目開發(fā)基礎(chǔ)jni與底層調(diào)用android_第2頁
2021-10項目開發(fā)基礎(chǔ)jni與底層調(diào)用android_第3頁
2021-10項目開發(fā)基礎(chǔ)jni與底層調(diào)用android_第4頁
2021-10項目開發(fā)基礎(chǔ)jni與底層調(diào)用android_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Android JNI 開發(fā) 傳智姜維黑馬訓(xùn)練營 什么是JNIJNI java本地開發(fā)接口JNI 是一個協(xié)議這個協(xié)議用來溝通java代碼和外部的本地代碼(c/c+).通過這個協(xié)議,java代碼就可以調(diào)用外部的c/c+代碼外部的c/c+代碼也可以調(diào)用java代碼為什么用JNIJNI擴展了java 虛擬機的能力, 驅(qū)動開發(fā) (wifi-hotspot) 2.3 無線熱點共享 Native code效率高,數(shù)學(xué)運算,實時渲染的游戲上,音視頻處理 (極品飛車,opengl,ffmpeg)復(fù)用代碼 (文件壓縮,人臉識別)特殊的業(yè)務(wù)場景怎么用JNI1.C/C+語言2.掌握java jni流程 3.NDK

2、(native develop kits ) 北京傳智播客教育 C語言入門目標(biāo): 課程結(jié)束大家能看懂c代碼.會讀會調(diào)用.安排:基本數(shù)據(jù)類型基本輸入輸出函數(shù)數(shù)組指針結(jié)構(gòu)體枚舉開發(fā)環(huán)境介紹以后會在cygwin用gcc來開發(fā),現(xiàn)在在windows下用輕量級 dev-c+helloworld黑馬訓(xùn)練營 基本數(shù)據(jù)類型C的基本數(shù)據(jù)類型,char, int, float, double, signed, unsigned, long, short and void黑馬訓(xùn)練營 北京傳智播客教育 輸入輸出函數(shù)%d - int%ld long int%c - char%f - float%u 無符號數(shù)%hd 短整

3、型%lf double%x 十六進制輸出 int 或者long int 或者short int%o - 八進制輸出%s 字符串Int len;Scanf(“%d”,&len);北京傳智播客教育 什么是指針I(yè)nt main(void)int * p; /p 是變量的名字, int * 是一個類型/這個變量存放的是int類型變量的地址。int i =3;p=&i;system(“pause”); return 0;指針和指針變量的關(guān)系指針就是地址,地址就是指針地址就是內(nèi)存單元的編號指針變量是存放地址的變量指針和指針變量是兩個不同的概念但是要注意: 通常我們敘述時會把指針變量簡稱為指針,實際它們含義

4、并不一樣為什么使用指針 指針的重要性 直接訪問硬件 (opengl 顯卡繪圖) 快速傳遞數(shù)據(jù)(指針表示地址) 返回一個以上的值(返回一個數(shù)組或者結(jié)構(gòu)體的指針)表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)(結(jié)構(gòu)體) 方便處理字符串 指針有助于理解面向?qū)ο笕绾斡没绢愋偷闹羔業(yè)nt * pDouble * p指針常見錯誤互換兩個數(shù)字檢測實參形參是不是同一個參數(shù)#include void f(int i)i = 99;int main(void)int i =6;printf(i=%dn,i);f(i);printf(i=%dn,i);return 0 ;*號的三種含義*號的含義 1.乘法 3*5 2.定義指針變量 int

5、* p;/定義了一個名字叫p的變量,能夠存放int數(shù)據(jù)類型的地址3.指針運算符,/如果p是一個已經(jīng)定義好的指針變量則*p表示以p的內(nèi)容為地址的變量函數(shù)返回一個以上的值Void f(int *p ,int *q) *p =1; *q=2;Int main(void) int a =3,b=5;F(&a,&b);Printf(“%d %d n”,a,b);Return 0;指針和數(shù)組的關(guān)系數(shù)組名,下標(biāo)和指針的關(guān)系,指針變量的運算數(shù)組名int a5 /a是數(shù)組名,5是數(shù)組的大小,元素個數(shù)int a34 / 3行4列 a00就是數(shù)組的第一個元素Int b5A=b ;/錯誤一維數(shù)組名是個指針常量,它存放

6、的是一維數(shù)組第一個元素的地址int a5;int a34;printf(%#Xn,&a0);printf(%#Xn,&a);下標(biāo)和指針的關(guān)系如果p是個指針變量 則pi 等價于 *(p+i)確定一個一維數(shù)組確定數(shù)組需要兩個 參數(shù)及其原因 指針的運算指針占用幾個字節(jié)動態(tài)內(nèi)存分配問題動態(tài)內(nèi)存分配問題傳統(tǒng)數(shù)組的缺點1.數(shù)組長度必須實現(xiàn)指定,并且只能是常整數(shù).int a5;int len;int alen;/error2.傳統(tǒng)形式的數(shù)組,程序員沒法手動釋放空間數(shù)組一旦定義,系統(tǒng)為該數(shù)組分配的空間一直存在函數(shù)運行完畢,數(shù)組的空間就被釋放3.數(shù)組的長度不能在函數(shù)運行中動態(tài)增加或者縮小4.A函數(shù)定義的數(shù)組只有

7、在A沒執(zhí)行完畢前被使用,a函數(shù)運行完畢后,a的數(shù)組就無法被其他函數(shù)使用創(chuàng)建動態(tài)數(shù)組Malloc 函數(shù)realloc re- allocate用主函數(shù)外部方法修改主函數(shù)申請的一塊內(nèi)存中的值靜態(tài)內(nèi)存和動態(tài)內(nèi)存的比較動態(tài)創(chuàng)建一個動態(tài)大小的數(shù)組,賦值打印,釋放空間(20分鐘)靜態(tài)內(nèi)存和動態(tài)內(nèi)存動態(tài)內(nèi)存和靜態(tài)內(nèi)存的比較靜態(tài)內(nèi)存是系統(tǒng)是程序編譯執(zhí)行后系統(tǒng)自動分配,由系統(tǒng)自動釋放,靜態(tài)內(nèi)存是棧分配的.動態(tài)內(nèi)存是堆分配的.靜態(tài)變量不能跨函數(shù)使用多級指針函數(shù)的指針 1.定義int(*pf)(int x,int y);2.賦值 pf = add;3.引用 pf(3,5);什么是結(jié)構(gòu)體?為什么需要結(jié)構(gòu)體?每個學(xué)生都

8、有age score name. int age; int score; char name100; / c語言里面的字符串一般都存放在字符數(shù)組中. struct Studentint age;float score;char sex;int main(void)struct Student st=80,55.6f,F ;第一種struct Student int age; float score; char sex;第二種 typedef struct Student2 int age; float score; char sex; st2;第三種 struct int age; float

9、 score; char sex; st3怎么使用結(jié)構(gòu)體變量變量初始化,賦值動態(tài)創(chuàng)建一個存放學(xué)生信息的結(jié)構(gòu)體數(shù)組struct Student st = 80,55.5,F;struct Student st2;st2.age = 10;st2.score = 88.8f;st2.sex=F;printf(%d %f %cn, st.age, st.score, st.sex);struct Student * pst;pst = &stpst-age 在計算機內(nèi)部會被轉(zhuǎn)換為 (*pst).agepst-age的含義: pst所指向的結(jié)構(gòu)體變量中的age這個成員Union#include mai

10、n( ) struct date int year, month, day; today; union long i; int k; char ii; mix; printf(date:%dn,sizeof(struct date); printf(mix:%dn,sizeof(mix); 枚舉#include enum WeekDayMonday=8,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday;int main(void) /int day; enum WeekDay day = Sunday; printf(%dn,day); sys

11、tem(pause); return 0; typedef 聲明自定義數(shù)據(jù)類型,配合各種原有數(shù)據(jù)類型來達到簡化編程的目的的類型定義關(guān)鍵字。 搭建ndk開發(fā)環(huán)境NDK HelloWorld1.創(chuàng)建一個android工程2.JAVA代碼中寫聲明native 方法 public native String helloFromJNI();3. 創(chuàng)建jni目錄,編寫c代碼,方法名字要對應(yīng)4.編寫Android.mk文件5.Ndk編譯生成動態(tài)庫6.Java代碼load 動態(tài)庫.調(diào)用native代碼Android.mk詳細介紹重新審視這個程序1.創(chuàng)建一個android工程2.JAVA代碼中寫聲明native

12、 方法 public native String helloFromJNI();3.用javah工具生成頭文件4. 創(chuàng)建jni目錄,引入頭文件,根據(jù)頭文件實現(xiàn)c代碼5.編寫Android.mk文件6.Ndk編譯生成動態(tài)庫7.Java代碼load 動態(tài)庫.調(diào)用native代碼在c代碼中使用logcatAndroid.mk文件增加LOCAL_LDLIBS += -llogC代碼中增加#include #define LOG_TAG System.out#define LOGD(.) _android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, _VA_ARGS_)#

13、define LOGI(.) _android_log_print(ANDROID_LOG_INFO, LOG_TAG, _VA_ARGS_) LOGI(infon); LOGD(debugn);jstring Java_cn_itcast_ndk_DemoActivity_helloFromJNI(JNIEnv *env, jobject javaThis) return (*env)-NewStringUTF(env, Hello from native code!);JNIEnv 類型代表了java環(huán)境 通過JNIEnv* 指針,就可以對java端的代碼進行操作.創(chuàng)建java類的對象,調(diào)用java對象的方法獲取java對象的屬性 等等.jobject是個什么jobject obj 就是當(dāng)前方法所在的類代表的對象.java 與 c之間的數(shù)據(jù)傳遞java 與 c之間的數(shù)據(jù)傳遞public native int add(int x ,int y);public native Str

溫馨提示

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

評論

0/150

提交評論