版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Android和iOS開發(fā)都支持C++開發(fā),可以一套代碼多平臺(tái)使用。同時(shí)C++難以反編譯的特性也可以為Android開發(fā)帶來代碼的保密,另一native特性也可以提高代碼的運(yùn)行效率。一、為什么使用C/C++便于移植,用C/C++寫得庫(kù)可以方便在其他的平臺(tái)上再次使用。代碼的保護(hù),由于java層代碼很容易被反編譯,而C/C++庫(kù)反匯難度較大。提高程序的執(zhí)行效率,將要求高性能的應(yīng)用邏輯使用C/C++開發(fā),從而提高應(yīng)用程序的執(zhí)行效率。訪問現(xiàn)有開源庫(kù),需要訪問底層的API或引用一些只有C/C++的庫(kù)。二、開發(fā)工具介紹盡管AndroidStudio可以同時(shí)編寫C++和Java代碼,寫完就可以編譯運(yùn)行,但是對(duì)聯(lián)想和錯(cuò)誤提示并不是非常友好,個(gè)人建議C++的整體代碼使用VisualStudio或Xcode編譯開發(fā),聯(lián)想功能非常友好,編譯速度很快,調(diào)試也非常方便。VisualStudio(PC)Xcode(Mac)AndroidStudio(多平臺(tái))eclipse(多平臺(tái))三、第一行代碼1.如何在Objective-C項(xiàng)目中使用C++;在Objective-C使用C/C++非常簡(jiǎn)單,僅僅需要把m后綴的文件改成.mm即可使用C++,我們通常不會(huì)把.mm的文件寫到整個(gè)項(xiàng)目都有,而是設(shè)計(jì)一個(gè)接口,用來做兩個(gè)語言之間的橋梁,他們之間的交互僅僅在這個(gè)接口。要點(diǎn):String類型轉(zhuǎn)換//Objective-C(NSString)->C++(std::string)NSString*ocString="HelloWorld,OC";std::stringcppString=[ocStringUTF8String];std::cout<<cppString<<std::endl;//C++(std::string)->Objective-C(NSString)std::stringcppString2="HelloWorld,C++";NSString*ocString2=[NSStringstringWithCString:cppString2.c_str()encoding:[NSStringdefaultCStringEncoding]];NSLog(@"%@",ocString2);記得要include相關(guān)的文件#include<stdio.h>#include<iostream>2.在普通的JAVA項(xiàng)目中使用JNI編程由于我是在MAC下辦公,所以這里就介紹如何在MAC下進(jìn)行JNI開發(fā),在Windows平臺(tái)下的VirtualStudio也很簡(jiǎn)單。第一步:在Xcode下創(chuàng)建一個(gè)普通的。++項(xiàng)目第二步:關(guān)聯(lián)JavaVM的Framework路徑:/System/Library/Frameworks/JavaVM.framework/Frameworks/JavaNativeFoundation.framework/第三步:創(chuàng)建頭文件,用于和Java交互cn_taoweiji_nativemodule_NativeDemo.h#include<JavaVM/jni.h>#ifndef_Included_cn_taoweiji_nativemodule_NativeDemo#define_Included_cn_taoweiji_nativemodule_NativeDemo#ifdefcplusplusextern"C"{#endifJNIEXPORTjintJNICALLJava_cn_taoweiji_nativemodule_NativeDemq_add(JNIEnv*,jclass,jint,jint);JNIEXPORTvoidJNICALLJava_cn_taoweiji_nativemodule_NativeDemq_say(JNIEnv*,jclass,jstring);JNIEXPORTjstringJNICALLJava_cn_taoweiji_nativemodule^ativeDemo_getlnfo(JNIEnv*,jclass);JNIEXPORTvoidJNICALLJavEcn_taoweiji_nativemodule^ativeDemojnativeToJava(JNIEnv*,jclass,jobject);#ifdefcplusplus}#endif#endif第四步:創(chuàng)建實(shí)現(xiàn)NativeDemo.cpp#include^cn_taoweiji_nativemqdule_NativeDemq.h^#include<string>JNIEXPORTjintJNICALLJava_cn_taoweiji_nativemqdule_NativeDemq_add(JNIEnv*,jclass,jintparam1,jintparam2){jintresult=param1+param2;returnresult;}JNIEXPORTvoidJNICALLJava_cn_taoweiji_nativemodule_NativeDemo_say(JNIEnv*env,jclass,jstringparam)(//std::string->jstringconstchar*param_char=env->GetStringUTFChars(param,NULL);std::stringstr=param_char;}JNIEXPORTjstringJNICALLJava_cn_taoweiji_nativemodule_NativeDemo_getInfo(JNIEnv*env,jclass)(//jstring->std::stringstd::stringstr="Hi,IamC++.";jstringresult=env->NewStringUTF(str.c_str());returnresult;}JNIEXPORTvoidJNICALLJava_cn_taoweiji_nativemodule_NativeDemo_nativeToJava(JNIEnv*env,jclass,jobjectobj)(//調(diào)用Java方法jclasscls=env->FindClass"cn/taoweiji/nativemodule/NativeDemo");//intsubtract(,intparam2)->(II)IjmethodIDmid=env->GetMethodID(cls,"subtract","(II)I");intresult=int)env->CallIntMethod(obj,mid,10,2);//std::cout<<result<<std::endl;//常見類型轉(zhuǎn)換例子//StringgetInfo();//->()Ljava/lang/String;
//PackageinfogetPackageInfo(StringpackageName,intflags);//->(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;;第五步:編譯生成JNI文件,按+B(Product->Build).編譯后文件TjjjDEMO_MAC_JWIMTIDEMO_MAC_JNI防m(xù)ain.cpphcn_tacwEifi_natiuemoduIp_NativeDemo.hAEtiveDemo.cppAlOEMQ.MA.G_JNI▼IPrccFuetg——「ghowfnFinderOpenwithExternalEditorOpenAsShowFileInspectorNewFils...lOEMQ.MA.G_JNIAddFilesto“DEMOLMAC一JNiNewGroupNewGroupfromSeleciianSonbyNameSortbvTvp-e根據(jù)自己的電腦環(huán)境,查找編譯后的文件,我的路徑是/Users/Wiki/Library/Developer/Xcode/DerivedData/DEMO_MAC_JNI-clxymnzifegyfaajsaattzgxqfbr/Build/Products/Debug/DEMO_MAC_JNI第六步:編寫JNI接口packagecn.taoweiji.nativemodule;/***包名和類名稱一定要和前面的C++頭文件對(duì)應(yīng)
*cn_taoweiji_nativemodule_NativeDemo.h*/publicclassNativeDemo{publicstaticnativeintadd(intparaml,intparam2);publicstaticnativevoidsay(Stringname);publicstaticnativeStringgetInfo();publicstaticnativevoidnativeToJava(NativeDemonativeDemo);publicintsubtract(intparam1,intparam2){System.out.println"NativeDemo:"+String.format("%s-%s=%s,param1,param2,paraml-param2));returnparaml-param2;}}第七步:調(diào)用C++publicclassMain{static{System.loacT"/Users/Wiki/Library/Developer/Xcode/DerivedData/DEMO_MACJNI-clxymnzifegyfaajsaattzgxqfbr/Build/Products/Debug/DEMO_MAC_JNI");}publicstaticvoidmain(String[]args){Systemout.println("HelloWorld!");intresult=NativeDemo.add(1,2);Systemout.println("1+2="+String.valueOf(result));NativeDemo.say"Hello,IamJava.");Systemout.println("getInfo:"+NativeDemo.getInfo());NativeDemo.nativeToJavanewNativeDemo());3.在ANDROID項(xiàng)目中使用NDKAndroid的JNI開發(fā),C++文件必須編寫在獨(dú)立的module里面,Java接口代碼可以編寫在app(module),也可以和C++放在同一個(gè)module,通過gradle關(guān)聯(lián)。詳細(xì)代碼請(qǐng)自行下載demo瀏覽gradle配置(NativeModule)applyplugin:'com.android.library'android{compileSdkVersion23buildToolsVersion"24.0.0rc2"defaultConfig{minSdkVersio14targetSdkVersion23versionCodeL}…i0"buildTypes{release{minifyEnablefelseproguardFilesgetDefaultProguardFil'proguard-android.txt'),''ndk{moduleNa"joyrun"s"stlport_static"ldLi"log"http://用于解決android_log_printabiFilte"armeabi","armeabi-v7a","x86","x86_64","arm64-v8a//add-fexceptionstoallowthrowerror//add-wto"formatnotastringliteralandnoformatarguments[-Werror=format-security"}—}compil—?編寫JNI接口//NativeDemo.javapackagecn.taoweiji.nativemodule;publicclassNativeDemo{publicstaticnativeintadd(intparam1,intparam2);}編寫C++接口代碼,JNI文件目錄默認(rèn)是module/src/main/jni,可以通過gradle配置改變//cn_taoweiji_nativemodule_NativeDemo.h#include<jni.h>#ifndef_Included_cn_taoweiji_nativemodule_NativeDemo#define_Included_cn_taoweiji_nativemodule_NativeDemo#ifdefcplusplusextern"C"{#endif/*Class:cn_taoweiji_nativemodule_NativeDemoMethod:addSignature:(II)I*/JNIEXPORTjintJNICALLJava_cn_taoweiji_nativemodule_NativeDemo_add(JNIEnv*,jclass,jint,jint);#ifdefcplusplus}#endif#endif//NativeDemo.cpp#includencn_taoweiji_nativemodule_NativeDemo.hnJNIEXPORTjintJNICALLJava_cn_taoweiji_nativemodule_NativeDemo_add(JNIEnv*,jclass,jintparam1,jintparam2){jintresult=param1+param2;returnresult;}調(diào)用//靜態(tài)加載static{}—”)//調(diào)用intresult=NativeDemo.add(1,2);Log.i("1+2=",String.valueOf(result));四、NDK開發(fā)要點(diǎn)編譯文件分析將NativeModule編譯后生成的aar文件后綴改成.zip解壓,可以發(fā)現(xiàn)里面有個(gè)jni文件,打開可以看^U”armeabi”,“armeabi-v7a”,“x86”,“x86_64”,“arm64-v8a”等文件夾,再打開可以看到是以lib前綴的so格式文件,這就是編譯后的native層文件,我們平常引用的第三方庫(kù)(百度地圖)也是要添加這些文件到我們的libs文件夾,不同的名稱代表著不同平臺(tái)相關(guān)的編譯文件,市面上大多數(shù)的手機(jī)都是arm架構(gòu)CPU,x86架構(gòu)的手機(jī)幾乎沒人用(genymotion模擬器屬于x86平臺(tái)),所以我們通常發(fā)布APP不會(huì)考慮x86平臺(tái),僅僅添加armeabi文件即可,但是在開發(fā)過程中建議也添加x86的so文件,以方便我們?cè)谀M器上運(yùn)行。運(yùn)行庫(kù)Android平臺(tái)帶有一個(gè)微型的C運(yùn)行庫(kù)支持庫(kù),成為系統(tǒng)運(yùn)行庫(kù)。該運(yùn)行庫(kù)不支持一下特性:C標(biāo)準(zhǔn)庫(kù)、異常支持、RTTI支持。NDK提供了用于補(bǔ)充系統(tǒng)運(yùn)行庫(kù)功能的一些額外的C++運(yùn)行庫(kù)。C++運(yùn)行庫(kù)C++異常支持C++RTTIC++標(biāo)準(zhǔn)庫(kù)系統(tǒng)庫(kù)NoNoNoGAbi++NoYesNoSTLportNoYesYesGNUSTLYesYesYesSTLportSTLport是一個(gè)開源的、多平臺(tái)的C標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)。它提供一個(gè)C標(biāo)準(zhǔn)庫(kù)頭文件的完整集合以及對(duì)RTTI的支持。GNUSTLGNU標(biāo)準(zhǔn)C庫(kù),也叫l(wèi)ibstdc-v3,是AndroidNDK最全面的標(biāo)準(zhǔn)C運(yùn)行庫(kù)。它是一個(gè)正在開發(fā)的、以實(shí)現(xiàn)ISO標(biāo)準(zhǔn)C庫(kù)為目標(biāo)的開源項(xiàng)目。gradle配置STL運(yùn)行庫(kù)引用“armeabi”,“armeabi-v7a”,“x86”,“x86_64”,“arm64-v8a”等平臺(tái)配置C++輸出logcat配置一個(gè)編譯異常解決異常捕獲//生成so文件的名稱moduleName"joyrun"http://引入STL標(biāo)準(zhǔn)庫(kù)stl"stlport_static"http://gnustl_static//用于解決android_log_printldLibs"log"abiFilters"armeabi","armeabi-v7a","x86","x86_64","arm64-v8a"http://添加編譯的平臺(tái)//add-fexceptionstoallowthrowerror//add-wto"formatnotastringliteralandnoformatarguments[-Werror=format-security"IcFlags"-w-fexceptions"LOGCAT輸出#include<android/log.h>#defineLOGI(...)__android_log_print(ANDROID_LOG_INFO,ntag_joyrun",VAARGS__)#defineLOGE(...)android_log_print(ANDROID_LOG_ERROR,"tag_joyrunn,VAARGS__)LOGE("HelloLogcat");類型轉(zhuǎn)換//std::string->jstringstd::stringstr="HelloWorld";jstringresult=env->NewStringUTF(str.c_str());//jstring->std::stringjstringparam;constchar*param_char=env->GetStringUTFChars(param,NULL);std::stringstr=param_char;//jboolean兩個(gè)值JNI_TRUE、JNI_FALSEC++調(diào)用JAVA代碼//JavapublicstaticnativevoidnativeToJava(NativeDemonativeDemo);publicintsubtract(intparam1,intparam2){Log.e("NativeDemo",String.format("%s-%s=%s,param1,param2,param1-param2));returnparam1-param2;}//C++JNIEXPORTvoidJNICALLJava_cn_taoweiji_nativemodule_NativeDemo_nativeToJava(JNIEnv*env,jclass,jobjectobj){//調(diào)用Java方法jclasscls=env->FindClass"cn/taoweiji/nativemodule/NativeDemo");jmethodIDmid=env->GetMethodID(cls,"subtract","(II)I");intresult=int)env->CallIntMethod(obj,mid,10,2);//常見類型轉(zhuǎn)換例子//StringgetInfo();//->()Ljava/lang/String;//PackageinfogetPackageInfo(StringpackageName,intflags);//->(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;;}一鍵生成從JAVA到C++接口代碼腳本文件:autojavah.sh#!/bin/shexportProjectPath=$(cd"../$(dirname"$1")";pwd)exportTargetClassName="co.runner.app.jni.NativeDemo"exportSourceFile="${ProjectPath}/app/src/main/java"exportTargetPath="${ProjectPath}/jni-joyrun/src/main/jni"cd"${SourceFile}"javah-d${TargetPath}-classpath"${SourceFile}""${TargetClassName}echo-d${TargetPath}-classpath"${SourceFile}""${TargetClassName}"五、C++面向?qū)ο蠹皹?biāo)準(zhǔn)庫(kù)入門C++類定義//Demo.hpp#ifndefDemo_hpp#defineDemo_hpp#include<stdio.h>#include<string>classDemo{public:std::stringname;intage=0;voidsay();_5類方法的實(shí)現(xiàn)//Demo.cpp#include"Demo.hpp"#include<iostream>”idDemo:")='="~dl對(duì)象創(chuàng)建及訪問對(duì)象的成員//對(duì)象創(chuàng)建Demod1;Demo*d2=newDemo;//運(yùn)算符訪問d1.say();//指針訪問d2->say();//靜態(tài)函數(shù)訪問intresult=Demo::add(1,2);std::cout<<"1+2=<<result<<std::endl;LIST鏈表//include相關(guān)文件#include<stdio.h>#include<iostream>#include<list>#include"Demo.hpp
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東省德慶縣孔子中學(xué)高中體育《短跑技術(shù)》教案 新人教版
- 八年級(jí)地理上冊(cè) 2.1千姿百態(tài)的地表形態(tài)教案 晉教版
- 2024年四年級(jí)英語下冊(cè) Unit 8 What Can You Do Lesson 1教案 陜旅版(三起)
- 2024秋四年級(jí)英語上冊(cè) Unit 1 My classroom PartA說課稿 人教PEP
- 文書模板-房屋維修合同
- 租賃印刷廠合同(2篇)
- 奧特曼課件視頻
- 觸電急救課件
- 蘇教版江蘇省南京市2023-2024學(xué)年高二上學(xué)期期末模擬數(shù)學(xué)試題
- 環(huán)境問題 課件
- TD-T 1041-2013 土地整治工程質(zhì)量檢驗(yàn)與評(píng)定規(guī)程
- 文化差異與跨文化交際知到章節(jié)答案智慧樹2023年鄭州大學(xué)
- 基恩士FS-N18N放大器常用調(diào)試說明書
- 保潔人員排班表
- 2023年安徽省交通控股集團(tuán)招聘筆試題庫(kù)及答案解析
- 領(lǐng)導(dǎo)在班組長(zhǎng)會(huì)上的講話(5篇)
- LY/T 1956-2011縣級(jí)林地保護(hù)利用規(guī)劃編制技術(shù)規(guī)程
- GB/T 30842-2014高壓試驗(yàn)室電磁屏蔽效能要求與測(cè)量方法
- GB/T 20399-2006自然保護(hù)區(qū)總體規(guī)劃技術(shù)規(guī)程
- 簡(jiǎn)單折紙筆筒制作
- 九年級(jí)化學(xué)上冊(cè)復(fù)習(xí)課件(1-7單元)(2)第五單元復(fù)習(xí)課件
評(píng)論
0/150
提交評(píng)論