androidndk,android ndk

“Android NDK ”是什么,在什么情況下使用?

1、NDK是一系列工具的集合。

新昌網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,新昌網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為新昌1000多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的新昌做網(wǎng)站的公司定做!

2、NDK提供了一份穩(wěn)定、功能有限的API頭文件聲明。

3、NDK的發(fā)布,使“Java+C”的開發(fā)方式終于轉(zhuǎn)正,成為官方支持的開發(fā)方式。

4、NDK將使Android平臺(tái)支持C開發(fā)的開端。

NDK使得在android中,java可以調(diào)用C函數(shù)庫(kù)。我們都知道,java是半解釋型語(yǔ)言,很容易被反匯編后拿到源代碼文件,在開發(fā)一些重要協(xié)議時(shí),我們?yōu)榱税踩鹨?jiàn),使用C語(yǔ)言來(lái)編寫這些重要的部分,來(lái)增大系統(tǒng)的安全性。還有,在一些接近硬件環(huán)境下,相信大家都清楚C與java的優(yōu)劣。順帶提一下:NDK并不能顯著提升應(yīng)用效率。why?我們都覺(jué)得C語(yǔ)言比起java來(lái)說(shuō)效率要高出很多,一方面,隨著jdk的不斷更新,java的效率也隨之提高;另一方面,即便使用C語(yǔ)言編碼提高了應(yīng)用效率,但是在java與C相互調(diào)用時(shí)平白又增大了開銷。

1、NDK是一系列工具的集合。

NDK提供了一系列的工具,幫助開發(fā)者快速開發(fā)C(或C++)的動(dòng)態(tài)庫(kù),并能自動(dòng)將so和java應(yīng)用一起打包成apk。這些工具對(duì)開發(fā)者的幫助是巨大的。

NDK集成了交叉編譯器,并提供了相應(yīng)的mk文件隔離CPU、平臺(tái)、ABI等差異,開發(fā)人員只需要簡(jiǎn)單修改mk文件(指出“哪些文件需要編譯”、“編譯特性要求”等),就可以創(chuàng)建出so。

NDK可以自動(dòng)地將so和Java應(yīng)用一起打包,極大地減輕了開發(fā)人員的打包工作。

2、NDK提供了一份穩(wěn)定、功能有限的API頭文件聲明。

Google明確聲明該API是穩(wěn)定的,在后續(xù)所有版本中都穩(wěn)定支持當(dāng)前發(fā)布的API。從該版本的NDK中看出,這些API支持的功能非常有限,包含有:C標(biāo)準(zhǔn)庫(kù)(libc)、標(biāo)準(zhǔn)數(shù)學(xué)庫(kù)(libm)、壓縮庫(kù)(libz)、Log庫(kù)(liblog)。

3、NDK的發(fā)布,使“Java+C”的開發(fā)方式終于轉(zhuǎn)正,成為官方支持的開發(fā)方式。

使用NDK,我們可以將要求高性能的應(yīng)用邏輯使用C開發(fā),從而提高應(yīng)用程序的執(zhí)行效率。

使用NDK,我們可以將需要保密的應(yīng)用邏輯使用C開發(fā)。畢竟,Java包都是可以反編譯的。

NDK促使專業(yè)so組件商的出現(xiàn)。(樂(lè)觀猜想,要視乎Android用戶的數(shù)量)

4、NDK將使Android平臺(tái)支持C開發(fā)的開端。

NDK提供了的開發(fā)工具集合,使開發(fā)人員可以便捷地開發(fā)、發(fā)布C組件。同時(shí),Google承諾在NDK后續(xù)版本中提高“可調(diào)式”能力,即提供遠(yuǎn)程的gdb工具,使我們可以便捷地調(diào)試C源碼。在支持Android平臺(tái)C開發(fā),我們能感覺(jué)到Google花費(fèi)了很大精力,我們有理由憧憬“C組件支持”只是Google Android平臺(tái)上C開發(fā)的開端。畢竟,C程序員仍然是碼農(nóng)陣營(yíng)中的絕對(duì)主力,將這部分人排除在Android應(yīng)用開發(fā)之外,顯然是不利于Android平臺(tái)繁榮昌盛的。

android ndk到底是什么?

NDK是一系列工具的集合。它提供了一系列的工具,幫助開發(fā)者快速開發(fā)C(或C++)的動(dòng)態(tài)庫(kù),并能自動(dòng)將so和java應(yīng)用一起打包成apk(AndroidPackage的縮寫,Android安裝包)。這些工具對(duì)開發(fā)者的幫助是巨大的。它集成了交叉編譯器,并提供了相應(yīng)的mk文件隔離CPU、平臺(tái)、ABI等差異,開發(fā)人員只需要簡(jiǎn)單修改mk文件(指出“哪些文件需要編譯”、“編譯特性要求”等),就可以創(chuàng)建出so。它可以自動(dòng)地將so和Java應(yīng)用一起打包,極大地減輕了開發(fā)人員的打包工作。

NDK提供了一份穩(wěn)定、功能有限的API頭文件聲明,Google明確聲明該API是穩(wěn)定的,在后續(xù)所有版本中都穩(wěn)定支持當(dāng)前發(fā)布的API。從該版本的NDK中看出,這些API支持的功能非常有限,包含有:C標(biāo)準(zhǔn)庫(kù)(libc)、標(biāo)準(zhǔn)數(shù)學(xué)庫(kù)(libm)、壓縮庫(kù)(libz)、Log庫(kù)(liblog)。

android ndk 怎樣調(diào)用第三方的so庫(kù)文件

問(wèn)題描述:Android如何調(diào)用第三方SO庫(kù);

已知條件:SO庫(kù)為Android版本連接庫(kù)(*.so文件),并提供了詳細(xì)的接口說(shuō)明;

已了解解決方案:

1.將SO文件直接放到libs/armeabi下,然后代碼中System.loadLibrary("xxx");再public native static int xxx_xxx_xxx();接下來(lái)就可以直接調(diào)用xxx_xxx_xxx()方法;

2.第二種方案,創(chuàng)建自己的SO文件,在自己的SO文件里調(diào)用第三方SO,再在程序中調(diào)用自己的SO,這種比較復(fù)雜,需要建java類文件,生成.h文件,編寫C源文件include之前生成的.h文件并實(shí)現(xiàn)相應(yīng)方法,最后用android NDK開發(fā)包中的ndk-build腳本生成對(duì)應(yīng)的.so共享庫(kù);

求解:

1.上面兩種方案是否可行?不可行的話存在什么問(wèn)題?

2.兩種方案有什么區(qū)別?為什么網(wǎng)上大部都是用的第二種方案?

3.只有一個(gè)*.so文件,并提供了詳細(xì)的接口說(shuō)明,是否可在ANDROID中使用它?

首先要看這個(gè)SO是不是JNI規(guī)范的SO,比如有沒(méi)有返回JNI不直接支持的類型。也就是說(shuō)這個(gè)SO是不是可以直接當(dāng)作JNI來(lái)調(diào)用。如果答案是否定的,你只能選第二個(gè)方案。

如果答案是肯定的,還要看你是不是希望這個(gè)SO的庫(kù)直接暴露給JAVA層,如果答案是否定的,你只能選第二個(gè)方案,比如你本身也是一個(gè)庫(kù)的提供者。

一般如果你只有SO,就說(shuō)明這個(gè)是別人提供給你的,你可以要求對(duì)方給你提供配套的JAVA調(diào)用文件。

1、這個(gè)要看這個(gè)SO是不是符合JNI調(diào)用的規(guī)范。還要看你自己的意愿。

2、因?yàn)榈诙N方法最靈活,各種情況都可以實(shí)現(xiàn)。

3、可以

看能不能直接從JAVA調(diào)用的最簡(jiǎn)單的方法就是看SO里的函數(shù)名是不是Java_XXX_XXX_XXX格式的

是就可以,你可以自己寫一個(gè)配套的JAVA文件,注意一下SO函數(shù)名和JAVA函數(shù)名的轉(zhuǎn)換規(guī)則,或者向SO提供方索要;

不是的話就選第二種方案吧。

1、檢查所需文件是否齊全

使用第三方動(dòng)態(tài)庫(kù),應(yīng)該至少有2個(gè)文件,一個(gè)是動(dòng)態(tài)庫(kù)(.so),另一個(gè)是包含

動(dòng)態(tài)庫(kù)API聲明的頭文件(.h)

2、封裝原動(dòng)態(tài)庫(kù)

原動(dòng)態(tài)庫(kù)文件不包含jni接口需要的信息,所以我們需要對(duì)其進(jìn)行封裝,所以我

們的需求是:將libadd.so 里面的API封裝成帶jni接口的動(dòng)態(tài)

3、編寫庫(kù)的封裝函數(shù)libaddjni.c

根據(jù)前面生成的com_android_libjni_LibJavaHeader.h 文件,編寫libaddjni.c,用

來(lái)生成libaddjni.so

Android中集成第三方軟件包(.jar, .so)

Android中可能會(huì)用到第三方的軟件包,這包括Java包.jar和Native包.so。jar包既可通過(guò)Eclipse開發(fā)環(huán)境集成,也可通過(guò)編譯源碼集成,看你的工作環(huán)境。

假定自己開發(fā)的程序?yàn)镸yMaps,需要用到BaiduMaps的庫(kù),包括baidumapapi.jar和libBMapApiEngine_v1_3_1.so。

一、Eclipse中集成第三方j(luò)ar包及.so動(dòng)態(tài)庫(kù)

MyMaps工程下創(chuàng)建目錄libs以及l(fā)ibs/armeabi,把baidumapapi.jar放在的libs/目錄下,把libBMapApiEngine_v1_3_1.so放在libs/armeabi/下。

Eclipse中把第三方j(luò)ar包baidumapapi.jar打包到MyMaps的步驟:

1. 右擊工程,選擇Properties;

2. Java Build Path,選擇Libraries;

3. Libraries頁(yè)面點(diǎn)擊右面按鈕“Add Library…”;

4. 選擇“User Library”,點(diǎn)擊“Next”;

5. 點(diǎn)擊“User Libraries”按鈕;

6. 在彈出界面中,點(diǎn)擊“New…”;

7. 輸入“User library name”,點(diǎn)擊“OK”確認(rèn);

8. 返回之后,選擇剛剛創(chuàng)建的User library,右面點(diǎn)擊“AddJARs”;

9. 選擇MyMaps/libs/下的baidumapapi.jar;

10. 確認(rèn),返回。

這樣,編譯之后,該jar包就會(huì)被打進(jìn)MyMaps.apk中,libBMapApiEngine_v1_3_1.so也被打包在lib/armeabi/中。

程序運(yùn)行過(guò)程中,libBMapApiEngine_v1_3_1.so被放在/data/data/yourAppPackage/lib/下,加載動(dòng)態(tài)庫(kù)時(shí)系統(tǒng)會(huì)從程序的該lib/目錄下查找.so庫(kù)。

二、源碼中集成第三方集成jar包及.so動(dòng)態(tài)庫(kù)

Android源碼中MyMaps放在packages/apps下。MyMaps下創(chuàng)建目錄libs以及l(fā)ibs/armeabi,并把baidumapapi.jar放在libs/,把libBMapApiEngine_v1_3_1.so放在libs/armeabi。

2.1 修改Android.mk文件

Android.mk文件如下:

[plain] view plaincopy

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_STATIC_JAVA_LIBRARIES := libbaidumapapi

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_PACKAGE_NAME := MyMaps

include $(BUILD_PACKAGE)

##################################################

include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=libbaidumapapi:libs/baidumapapi.jar

LOCAL_PREBUILT_LIBS :=libBMapApiEngine_v1_3_1:libs/armeabi/libBMapApiEngine_v1_3_1.so

LOCAL_MODULE_TAGS := optional

include $(BUILD_MULTI_PREBUILT)

# Use the following include to make our testapk.

include $(callall-makefiles-under,$(LOCAL_PATH))

1 集成jar包

LOCAL_STATIC_JAVA_LIBRARIES取jar庫(kù)的別名,可以任意取值;

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES指定prebuiltjar庫(kù)的規(guī)則,格式:別名:jar文件路徑。注意:別名一定要與LOCAL_STATIC_JAVA_LIBRARIES里所取的別名一致,且不含.jar;jar文件路徑一定要是真實(shí)的存放第三方j(luò)ar包的路徑。

編譯用BUILD_MULTI_PREBUILT。

2 集成.so動(dòng)態(tài)庫(kù)

LOCAL_PREBUILT_LIBS指定prebuilt so的規(guī)則,格式:別名:so文件路徑。注意:別名一般不可改變,特別是第三方j(luò)ar包使用.so庫(kù)的情況,且不含.so;so文件路徑一定要是真實(shí)的存放第三方so文件的路徑。

編譯拷貝用BUILD_MULTI_PREBUILT。

2.2 加入到GRANDFATHERED_USER_MODULES

在文件user_tags.mk中,把libBMapApiEngine_v1_3_1加入到GRANDFATHERED_USER_MODULES中

[plain] view plaincopy

GRANDFATHERED_USER_MODULES += \

… \

libBMapApiEngine_v1_3_1

user_tags.mk可以是build/core下的,也可以是$(TARGET_DEVICE_DIR)下的,推薦修改$(TARGET_DEVICE_DIR)下的。

2.3 編譯結(jié)果

MyMaps.apk編譯生成在out/target/product/YourProduct/system/app/下;

libBMapApiEngine_v1_3_1.so放在out/target/product/YourProduct/system/lib/下,這也是系統(tǒng)加載動(dòng)態(tài)庫(kù)時(shí)搜索的路徑。

android ndk是什么

NDK是用來(lái)給安卓手機(jī)開發(fā)軟件用的,但是和SDK不同的是它用的是C語(yǔ)言,而SDK用的是Java語(yǔ)言。

NDK開發(fā)的軟件在安卓的環(huán)境里是直接運(yùn)行的,一般只能在特定的CPU指令集的機(jī)器上運(yùn)行,而且C語(yǔ)言可以直接和硬件對(duì)話,因此一般用它開給手機(jī)開發(fā)驅(qū)動(dòng)或底層應(yīng)用;而SDK開發(fā)出的軟件在安卓上靠Dalvik虛擬機(jī)來(lái)運(yùn)行,所以如果沒(méi)有特殊的需要或署專門針對(duì)某個(gè)硬件去開發(fā),那就一般用SDK

網(wǎng)站題目:androidndk,android ndk
轉(zhuǎn)載注明:http://muchs.cn/article28/phghjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、域名注冊(cè)、網(wǎng)站導(dǎo)航網(wǎng)站設(shè)計(jì)公司、建站公司、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)