电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

如何在Android Studio下進行NDK開發

瀏覽:43日期:2022-09-24 10:42:25

在AS中進行NDK開發之前,我們先來簡單的介紹幾個大家都容易搞懵的概念:

1. 到底什么是JNI,什么是NDK?

2. 何為“交叉編譯”?

先看什么是JNI?JNI的全稱就是Java Native Interface,即java本地開發接口??赡艽蠹液臀乙粯?,一聽到接口什么的就犯懵:“我也知道這是java本地開發接口的意思,但它具體是個什么意思我還是搞不明白。”其實JNI它就是一種協議,一說協議,那它就是對某種東西的一個規范和約束,說的好聽一點就是標準化。如果你想用我這個東西,那你必須要遵守我這邊的規范。像http協議一樣,http作為超文本傳輸協議,它規范了我們上網時從客戶端到服務器端等一系列的運作流程。正因為如此,我們才能暢通無阻的上網。那么換做JNI也一樣,只不過JNI這個協議是用來溝通java代碼和外部的本地代碼(c/c++)。也就是說有了JNI這個協議,我們才能夠隨意的讓java代碼調用C/C++的代碼,同樣C/C++的代碼也可以調用java的代碼。如果沒有這個協議作為支撐,那么java和C/C++代碼想要相互調用是不可能的。下面通過兩個圖簡單看一下JNI協議在系統架構中處于什么位置:

如何在Android Studio下進行NDK開發

在上圖中,上層綠色的部分一般都是用Java代碼寫的,下層橘黃色的部分一般都是用C/C++代碼寫的。可以看出,正式由于有了中間JNI的存在我們才可以在Application層通過JNI調用下層中的一些東西。了解了JNI的概念后,我們再看看NDK,NDK(Native Development Kit)就比較好理解了,它就是一個本地開發的“工具包”。Java開發要用到JDK,Android開發要用到SDK,那我們在Android中要進行native開發,也要用到它對應的工具包,即NDK。通俗的來講,NDK就是幫助我們可以在Android應用中使用C/C++來完成特定功能的一套工具。 NDK的作用有很多,我們簡單的列舉兩個,比如:

1.首先NDK可以幫助開發者“快速”開發C(或C++)的動態庫。

2.其次,NDK集成了“交叉編譯器”。使用NDK,我們可以將要求高性能的應用邏輯使用C開發,從而提高應用程序的執行效率。

上面提到了“交叉編譯”,我們最后再解釋一下什么是交叉編譯。大家都知道編譯器在將中間代碼連接成當前計算機可執行的二進制程序時,連接程序會根據當前計算機的CPU、操作系統的類型來轉換。而根據運行的設備的不同,CPU的架構也是不同,大體有如下三種常見的CUP架構:

arm結構 :主要在移動手持、嵌入式設備上。我們的手機幾乎都是使用的這種CUP架構。 x86結構 : 主要在臺式機、筆記本上使用。如Intel和AMD的CPU 。 MIPS架構:多用在網關、貓、機頂盒等設備。

若想在使用了基于x86架構CPU的操作系統上編譯出可以在基于arm結構CPU的操作系統上運行的代碼,就必須使用交叉編譯。所以綜上所述:交叉編譯就是在一個平臺下(比如:CPU架構為X86,操作系統為Windows)編譯出在另一個平臺上(比如:CPU架構為arm,操作系統為Linux)可以執行的二進制代碼。Google提供的NDK就可以完成交叉編譯的工作。

好了,上面的基本概念介紹完以后,我們正式進入AS下NDK開發的講解。

1.首先,你需要把NDK下載下來NDK下載。下載完成后解壓到任意目錄即可(路徑中不要帶有中文字符)。我的就直接放在D盤的ndk目錄下:

如何在Android Studio下進行NDK開發

2.在AS中為你的項目配置NDK。首先新建一個Android工程JNIDemo,Ctrl + shift + alt + s打開Project Structrue把我們剛才下載好的NDK配置進去,點擊OK。

如何在Android Studio下進行NDK開發

3.配置好NDK后,簡單的為我們的項目布局文件添加一個TextView和一個Button,當點擊Button的時候,我們通過調用底層自己寫好的C/C++代碼來返回一個字符串,最后呈現在TextView上。activity_main.xml布局代碼:

<?xml version='1.0' encoding='utf-8'?><LinearLayout xmlns:android='http://schemas.android.com/apk/res/android' android:layout_width='match_parent' android:layout_height='match_parent' android:orientation='vertical'> <TextView android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:text='Hello World!' /> <Button android: android:layout_width='match_parent' android:layout_height='wrap_content' android:text='button'/></LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView textview = findViewById(R.id.textview); Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {textview.setText(JNIUtils.sayHelloFromJNI()); } }); }}

上面代碼中的JNIUtils.sayHelloFromeJNI()就是我們在與MainActivity相同的包中新建JNIUtils類后在里面編寫的native方法。如下所示:

如何在Android Studio下進行NDK開發

可以看到我們上面的sayHelloFromJNI()方法顯示的是警告紅色。把鼠標放到上面,它會提示我們對應的JNI頭文件沒有查找到。那么接下來我們要做的就是去生成與這個sayHelloFromJNI()方法所對應的頭文件。

4.生成頭文件??旖萱Ialt + F12調出AS下的Terminal窗口,在Terminal命令行窗口中輸入如下幾條指令,回車:

如何在Android Studio下進行NDK開發

前面兩個cd命令沒什么好說的,就是先進入當前項目的app目錄下,然后再進入Java目錄下。我們重點說一下最后一條命令:javah -d ../jni com.example.zhangxudong.jindemo.JNIUtils。首先,要生成Java類對應的頭文件我們就必須要用到javah這個命令,其次-d表示生成一個目錄,那生成一個什么樣的目錄,具體又在哪里去生成這個目錄呢?后面的../jni告示了我們。../表示在當前目錄的上一層目錄,我們當前在Java目錄下,那么它的上層目錄就是main目錄了。而jni就表示我們生成的目錄的名稱。所以整個../jni就表示在main目錄下生成一個名為jni的目錄。最后一個com.example.zhangxudong.jindemo.JNIUtils就是我們在上面新建的JNIUtils的完整類名了。執行完這幾天指令后,刷新一下目錄我們就可以在main目錄下看到jni這個目錄,并且在它里面生成了我們JNIUtils類所對應的頭文件。進入頭文件中,代碼是如下這個樣子:

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_example_zhangxudong_jnidemo_JNIUtils */#ifndef _Included_com_example_zhangxudong_jnidemo_JNIUtils#define _Included_com_example_zhangxudong_jnidemo_JNIUtils#ifdef __cplusplusextern 'C' {#endif/* * Class: com_example_zhangxudong_jnidemo_JNIUtils * Method: sayHelloFromJNI * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_example_zhangxudong_jnidemo_JNIUtils_sayHelloFromJNI (JNIEnv *, jclass);#ifdef __cplusplus}#endif#endif

5.頭文件生成以后,我們就需要編寫我們的C/C++代碼了。右鍵jni目錄---->new--->C/C++ Source File

如何在Android Studio下進行NDK開發

輸入要新建的C/C++文件名稱JNIHello,這里我們用C++來編寫,所以Type為.cpp,如果你選擇用C來編寫,那么Type選為.c,點擊ok。這里說一下,在我們進行NDK開發的時候,選擇用C還是C++,在編寫代碼的時候除了C和C++基本的語法不同外,還是有許多不同地方需要注意。我們后續會慢慢介紹。這里先默認跟著我的步驟來。

如何在Android Studio下進行NDK開發

JNIHello.cpp代碼如下:

#include 'com_example_zhangxudong_jnidemo_JNIUtils.h'JNIEXPORT jstring JNICALL Java_com_example_zhangxudong_jnidemo_JNIUtils_sayHelloFromJNI (JNIEnv *env, jclass jclass){return env->NewStringUTF('Hello World From JNI!!!!!');}

可以看到我們首先需要把原來生成的JNIUtlis對應的頭文件引入進來,下面的代碼基本都是從com_example_zhangxudong_jnidemo_JNIUtils.h中復制粘貼過來的一部分,然后稍加修改。修改的地方主要有sayHelloFromJNI的兩個參數和里面的簡單實現,參數方面就是加了env和jclass兩個字段。函數里面的實現呢,就是簡單的返回一個字符串“Hello World From JNI!!!!!”,至于為什么這么寫,我會在下一篇文章進行講解,大家現在就需要知道如果要在這里返回一個字符串就必須要通過env->NewStringUTF('xxxxxx');這行代碼。

6.上面的搞定以后,我們需要在app的build.gradle中的defaultConfig中加入如下代碼。它表示項目在編譯時生成的動態庫的名字。

如何在Android Studio下進行NDK開發

最后,我們還需在JNIUitls中加載我們生成的動態庫:

public class JNIUtils { static { System.loadLibrary('JNIHello'); } public static native String sayHelloFromJNI();}

我們把加載動態庫的代碼放到靜態代碼塊中,就是表示在JNIUtils這個類在加載的時候就去加載我們的動態庫。

7.經過上面的5步,關于如何在AS中進行簡單的NDK所需要的步驟差不多就講完了。不過還有最后一點需要注意。到這里我們基本就可以執行一下我們的項目了,現在運行一下項目試一試......不出意外的話項目是build不成功的,它會報如下的錯誤:

Error:Execution failed for task ’:app:compileDebugNdk’.> Error: Flag android.useDeprecatedNdk is no longer supported and will be removed in the next version of Android Studio. Please switch to a supported build system.Consider using CMake or ndk-build integration. For more information, go to:https://d.android.com/r/studio-ui/add-native-code.html#ndkCompileTo get started, you can use the sample ndk-build script the Androidplugin generated for you at:E:JNIDemoappbuildintermediatesndkdebugAndroid.mkAlternatively, you can use the experimental plugin:https://developer.android.com/r/tools/experimental-plugin.htmlTo continue using the deprecated NDK compile for another 60 days, set android.deprecatedNdkCompileLease=1515317190556 in gradle.properties

因為我這里用的是Android Studio3.0,報出的這個錯誤很可能和原來版本的AS不同,以前出現類似錯誤的時候,我們的解決方案一般都是在gradle.properties中添加一行這樣的代碼:android.useDeprecatedNdk=true就搞定了。但是AS換為3.0后你可以再試一下這種方案,肯定是不行的,它會提示你“Flag android.useDeprecatedNdk is no longer supported and will be removed in the next version of Android Studio. Please switch to a supported build system.”大體意思就是最新的AS已經不支持useDeprecatedNdk這個標記了,并且在后續版本的AS中,它將被移除。所以我們新的解決方案就是按照它的提示在gradle.properties中添家android.deprecatedNdkCompileLease=1515317190556這行代碼。

最后我們運行一下項目,點擊button,效果如下??梢钥吹剑覀兂晒Φ耐ㄟ^java代碼調用了C++的代碼,并返回Hello World From JNI!!!!!這個字符串。

如何在Android Studio下進行NDK開發

那我們生成的動態庫(.so文件)都在哪里呢?點開app--->build--->intermediates--->ndk--->debug--->libs,可以看到各個平臺對應的動態庫都已經生成了。

如何在Android Studio下進行NDK開發

到此這篇關于如何在Android Studio下進行NDK開發的文章就介紹到這了,更多相關Android Studio下NDK開發內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
主站蜘蛛池模板: 书信之家_书信标准模板范文大全| 手持式浮游菌采样器-全排二级生物安全柜-浙江孚夏医疗科技有限公司 | 解放卡车|出口|济南重汽|报价大全|山东三维商贸有限公司 | 苏商学院官网 - 江苏地区唯一一家企业家自办的前瞻型、实操型商学院 | 全自动在线分板机_铣刀式在线分板机_曲线分板机_PCB分板机-东莞市亿协自动化设备有限公司 | 一体化污水处理设备,一体化污水设备厂家-宜兴市福源水处理设备有限公司 | 无刷电机_直流无刷电机_行星减速机-佛山市藤尺机电设备有限公司 无菌检查集菌仪,微生物限度仪器-苏州长留仪器百科 | 物流之家新闻网-最新物流新闻|物流资讯|物流政策|物流网-匡匡奈斯物流科技 | 广西绿桂涂料--承接隔热涂料、隔音涂料、真石漆、多彩仿石漆等涂料工程双包施工 | 浙江筋膜枪-按摩仪厂家-制造商-肩颈按摩仪哪家好-温州市合喜电子科技有限公司 | 电脑刺绣_绣花厂家_绣花章仔_织唛厂家-[源欣刺绣]潮牌刺绣打版定制绣花加工厂家 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 安平县鑫川金属丝网制品有限公司,防风抑尘网,单峰防风抑尘,不锈钢防风抑尘网,铝板防风抑尘网,镀铝锌防风抑尘网 | 高精度电阻回路测试仪-回路直流电阻测试仪-武汉特高压电力科技有限公司 | ISO9001认证咨询_iso9001企业认证代理机构_14001|18001|16949|50430认证-艾世欧认证网 | 云南成考网_云南成人高考报名网| 24位ADC|8位MCU-芯易德科技有限公司 | 万博士范文网-您身边的范文参考网站Vanbs.com | 帽子厂家_帽子工厂_帽子定做_义乌帽厂_帽厂_制帽厂_帽子厂_浙江高普制帽厂 | 杭州月嫂技术培训服务公司-催乳师培训中心报名费用-产后康复师培训机构-杭州优贝姆健康管理有限公司 | 湖南自考_湖南自学考试| 万濠投影仪_瑞士TRIMOS高度仪_尼康投影仪V12BDC|量子仪器 | 机械加工_绞车配件_立式离心机_减速机-洛阳三永机械厂 | 钢托盘,铁托盘,钢制托盘,镀锌托盘,饲料托盘,钢托盘制造商-南京飞天金属13260753852 | 早报网| 阳光模拟试验箱_高低温试验箱_高低温冲击试验箱_快速温变试验箱|东莞市赛思检测设备有限公司 | 传爱自考网_传爱自学考试网| 颚式破碎机,圆锥破碎机,制砂机-新乡市德诚机电制造有限公司 | 阻垢剂,反渗透阻垢剂,缓蚀阻垢剂-山东普尼奥水处理科技有限公司 真空粉体取样阀,电动楔式闸阀,电动针型阀-耐苛尔(上海)自动化仪表有限公司 | 协议书_协议合同格式模板范本大全 | 学叉车培训|叉车证报名|叉车查询|叉车证怎么考-工程机械培训网 | 伶俐嫂培训学校_月嫂培训班在哪里报名学费是多少_月嫂免费政府培训中心推荐 | 西宁装修_西宁装修公司-西宁业之峰装饰-青海业之峰墅级装饰设计公司【官网】 | 电动球阀_不锈钢电动球阀_电动三通球阀_电动调节球阀_上海湖泉阀门有限公司 | 生态板-实木生态板-生态板厂家-源木原作生态板品牌-深圳市方舟木业有限公司 | 太空舱_民宿太空舱厂家_移动房屋太空舱价格-豪品建筑 | 纯水电导率测定仪-万用气体检测仪-低钠测定仪-米沃奇科技(北京)有限公司www.milwaukeeinst.cn 锂辉石检测仪器,水泥成分快速分析仪-湘潭宇科分析仪器有限公司 手术室净化装修-手术室净化工程公司-华锐手术室净化厂家 | 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 带锯机|木工带锯机圆木推台锯|跑车带锯机|河北茂业机械制造有限公司| | 二维运动混料机,加热型混料机,干粉混料机-南京腾阳干燥设备厂 | 电脑知识|软件|系统|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网 |