導航:首頁 > 操作系統 > androidndk文檔

androidndk文檔

發布時間:2022-05-19 20:40:17

『壹』 android NDK開發簡介 NDK和SDK以及JNI有什麼關系

NDK:Android NDK 是在SDK前面又加上了「原生」二字,即Native Development Kit,因此又被Google稱為「NDK」。
NDK全稱:Native Development Kit。
NDK是一系列工具的集合。
* NDK提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk。這些工具對開發者的幫助是巨大的。
* NDK集成了交叉編譯器,並提供了相應的mk文件隔離CPU、平台、ABI等差異,開發人員只需要簡單修改mk文件(指出「哪些文件需要編譯」、「編譯特性要求」等),就可以創建出so。
* NDK可以自動地將so和Java應用一起打包,極大地減輕了開發人員的打包工作。
其實:
NDK就是能夠方便快捷開發.so文件的工具。JNI的過程比較復雜,生成.so需要大量操作,而NDK就是簡化了這個過程。

Android SDK:
SDK (software development kit)軟體開發工具包。被軟體開發工程師用於為特定的軟體包、軟體框架、硬體平台、操作系統等建立應用軟體的開發工具的集合。因此!Android SDk 指的既是Android專屬的軟體開發工具包

JNI:
Java Native Interface (JNI)標準是java平台的一部分,它允許Java代碼和其他語言寫的代碼進行交互。JNI 是本地編程介面,它使得在 Java 虛擬機 (VM) 內部運行的 Java 代碼能夠與用其它編程語言(如 C、C++ 和匯編語言)編寫的應用程序和庫進行交互操作
當然一般需要進行如下操作流程:
1) 編寫java程序:這里以HelloWorld為例。為了實現在 java代碼中調用c函數printf。
代碼1:
class HelloWorld {
public native void testHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().testHelloWorld();
}
}
聲明native方法:如果你想將一個方法做為一個本地方法的話,那麼你就必須聲明改方法為native的,並且不能實現。
Load動態庫:System.loadLibrary("hello");
這里一般是以static塊進行載入的。同時需要注意的是System.loadLibrary()的參數「hello」是動態庫的名字。
2) 編譯
javac HelloWorld.java
3) 生成擴展名為h的頭文件 javah ?
JNIEXPORT void JNICALL Java_HelloWorld_testHelloWorld (JNIEnv *, jobject);

這個h文件相當於我們在java裡面的介面,這里聲明了一個 Java_HelloWorld_testHelloWorld (JNIEnv *, jobject)方法,然後在我們 的本地方法裡面實現這個方法,也就是說我們在編寫C/C++程序的時候所使用的方法名必須和這里的一致)。
4) 編寫本地方法實現和由javah命令生成的頭文件裡面聲明的方法名相同的方法

代碼2:
#include "jni.h"
#include "HelloWorld.h"
#include other headers

JNIEXPORT void JNICALL Java_HelloWorld_testHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!/n");
return;
}
注意代碼2中的第1行,需要將jni.h(該文件可以在%JAVA_HOME%/include文件夾下面找到)文件引入,因為在程序中的JNIEnv、 jobject等類型都是在該頭文件中定義的;另外在第2行需要將HelloWorld.h頭文件引入。然後保存為 HelloWorldImpl.c就ok了。
5) 生成動態庫
這里以在Windows中為例,需要生成dll文件。在保存HelloWorldImpl.c文件夾下面,使用VC的編譯器cl成。 cl -I%java_home%/include -I%java_home%/include/win32 -LD HelloWorldImp.c -Fehello.dll 注意:生成的dll文件名在選項-Fe後面配置,這里是hello,因為在HelloWorld.java文件中我們loadLibary的時候使用的名字是hello。
另外需要將-I%java_home%/include -I%java_home%/include/win32參數加上,因為在第四步裡面編寫本地方法的時候引入了jni.h文件。

『貳』 android ndk 怎樣調用第三方的so庫文件

問題描述:Android如何調用第三方SO庫;
已知條件:SO庫為Android版本連接庫(*.so文件),並提供了詳細的介面說明;
已了解解決方案:
1.將SO文件直接放到libs/armeabi下,然後代碼中System.loadLibrary("xxx");再public native static int xxx_xxx_xxx();接下來就可以直接調用xxx_xxx_xxx()方法;
2.第二種方案,創建自己的SO文件,在自己的SO文件里調用第三方SO,再在程序中調用自己的SO,這種比較復雜,需要建java類文件,生成.h文件,編寫C源文件include之前生成的.h文件並實現相應方法,最後用android NDK開發包中的ndk-build腳本生成對應的.so共享庫;
求解:
1.上面兩種方案是否可行?不可行的話存在什麼問題?
2.兩種方案有什麼區別?為什麼網上大部都是用的第二種方案?
3.只有一個*.so文件,並提供了詳細的介面說明,是否可在ANDROID中使用它?

首先要看這個SO是不是JNI規范的SO,比如有沒有返回JNI不直接支持的類型。也就是說這個SO是不是可以直接當作JNI來調用。如果答案是否定的,你只能選第二個方案。

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

一般如果你只有SO,就說明這個是別人提供給你的,你可以要求對方給你提供配套的JAVA調用文件。

1、這個要看這個SO是不是符合JNI調用的規范。還要看你自己的意願。
2、因為第二種方法最靈活,各種情況都可以實現。
3、可以

看能不能直接從JAVA調用的最簡單的方法就是看SO里的函數名是不是Java_XXX_XXX_XXX格式的
是就可以,你可以自己寫一個配套的JAVA文件,注意一下SO函數名和JAVA函數名的轉換規則,或者向SO提供方索要;
不是的話就選第二種方案吧。

1、檢查所需文件是否齊全
使用第三方動態庫,應該至少有2個文件,一個是動態庫(.so),另一個是包含
動態庫API聲明的頭文件(.h)
2、封裝原動態庫
原動態庫文件不包含jni介面需要的信息,所以我們需要對其進行封裝,所以我
們的需求是:將libadd.so 裡面的API封裝成帶jni介面的動態
3、編寫庫的封裝函數libaddjni.c
根據前面生成的com_android_libjni_LibJavaHeader.h 文件,編寫libaddjni.c,用
來生成libaddjni.so

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

Android中可能會用到第三方的軟體包,這包括Java包.jar和Native包.so。jar包既可通過Eclipse開發環境集成,也可通過編譯源碼集成,看你的工作環境。

假定自己開發的程序為MyMaps,需要用到BaiMaps的庫,包括mapapi.jar和libBMapApiEngine_v1_3_1.so。

一、Eclipse中集成第三方jar包及.so動態庫

MyMaps工程下創建目錄libs以及libs/armeabi,把mapapi.jar放在的libs/目錄下,把libBMapApiEngine_v1_3_1.so放在libs/armeabi/下。

Eclipse中把第三方jar包mapapi.jar打包到MyMaps的步驟:

1. 右擊工程,選擇Properties;
2. Java Build Path,選擇Libraries;
3. Libraries頁面點擊右面按鈕「Add Library…」;
4. 選擇「User Library」,點擊「Next」;
5. 點擊「User Libraries」按鈕;
6. 在彈出界面中,點擊「New…」;
7. 輸入「User library name」,點擊「OK」確認;
8. 返回之後,選擇剛剛創建的User library,右面點擊「AddJARs」;
9. 選擇MyMaps/libs/下的mapapi.jar;
10. 確認,返回。

這樣,編譯之後,該jar包就會被打進MyMaps.apk中,libBMapApiEngine_v1_3_1.so也被打包在lib/armeabi/中。
程序運行過程中,libBMapApiEngine_v1_3_1.so被放在/data/data/<yourAppPackage>/lib/下,載入動態庫時系統會從程序的該lib/目錄下查找.so庫。

二、源碼中集成第三方集成jar包及.so動態庫

Android源碼中MyMaps放在packages/apps下。MyMaps下創建目錄libs以及libs/armeabi,並把mapapi.jar放在libs/,把libBMapApiEngine_v1_3_1.so放在libs/armeabi。

2.1 修改Android.mk文件

Android.mk文件如下:

[plain] view plain
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_STATIC_JAVA_LIBRARIES := libmapapi

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

LOCAL_PACKAGE_NAME := MyMaps

include $(BUILD_PACKAGE)

##################################################
include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=libmapapi:libs/mapapi.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庫的別名,可以任意取值;
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES指定prebuiltjar庫的規則,格式:別名:jar文件路徑。注意:別名一定要與LOCAL_STATIC_JAVA_LIBRARIES里所取的別名一致,且不含.jar;jar文件路徑一定要是真實的存放第三方jar包的路徑。
編譯用BUILD_MULTI_PREBUILT。
2 集成.so動態庫
LOCAL_PREBUILT_LIBS指定prebuilt so的規則,格式:別名:so文件路徑。注意:別名一般不可改變,特別是第三方jar包使用.so庫的情況,且不含.so;so文件路徑一定要是真實的存放第三方so文件的路徑。
編譯拷貝用BUILD_MULTI_PREBUILT。

2.2 加入到GRANDFATHERED_USER_MODULES

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

[plain] view plain
GRANDFATHERED_USER_MODULES += \
… \
libBMapApiEngine_v1_3_1

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

2.3 編譯結果

MyMaps.apk編譯生成在out/target/proct/<YourProct>/system/app/下;
libBMapApiEngine_v1_3_1.so放在out/target/proct/<YourProct>/system/lib/下,這也是系統載入動態庫時搜索的路徑。

『叄』 如何從零開始創建Android NDK應用

本文主內容:
1、 Android NDK 安裝
2、 安裝Cygwin與使用NDK編譯
3、 在Eclipse中集成C/C++開發環境CDT
4、 安裝Sequoyah插件
5、 JNI編譯環境配置

本文建立在已經完成Android開發環境搭建的基礎上。其基礎環境至少需要包含以下內容:
1、 JDK
2、 Eclipse
3、 Android SDK and ADT
可以參考我之前的「Android開發環境搭建」。
一、Android NDK 安裝與配置
下載Android NDK。下載地址:http://developer.android.com/tools/sdk/ndk/index.html
下載後解壓縮到你的工作目錄,例如:D:\Java\android-ndk-r8,結果如下圖:

注意:samples下麵包含幾個實例開發演示項目,第一次接觸NDK開發,建議先從示例開始。
docs內是技術文檔,英語能力強的可以研究研究。
二、安裝Cygwin與使用NDK編譯
由於NDK開發大都涉及到C/C++在GCC環境下編譯、運行,所以在Windows環境下,需要用Cygwin模擬linux編譯環境。
下載:
Cygwin的下載地址:http://www.cygwin.com/

點擊右上角的「setup.exe」即可下載。
安裝:
第一步:運行setup.exe程序,直接點擊Next進入下一步。
第二步:選擇安裝方式。第一次可以採用Direct Connection在線下載安裝,如有現成的離線包,可以選擇離線安裝(Install from Local Directory)。
第三步:選擇安裝目錄。比如D:\Java\Cygwin,注意此目錄是指Cygwin最終的安裝目錄,不是下載文件暫存目錄。
第四步:設置本地包暫存路徑。暫存目錄默認是放到setup.exe的同級目錄下,建議放到指定的文件夾,如D:\Cygwin_install_file。安裝完成後把這個文件夾打包備份,以後再配置時不用重新下載。
第五步:設置網路連接方式。這個目前河蟹沒爬過來,選第一個即可。
第六步:選擇下載站點地址。據說國內163站點的速度不錯,我也是用的這個。
第七步:等待載入安裝項載入,選擇安裝項。點擊Devel-Default,使之變成Devel-Install,展開後可以看到其下的子項被選中了(網上多數教程都說選中某12個包,找起來太坑爹了,直接全下載了吧,全選多了150M左右)。此界面其他設置都不用動。

第八步:等待下載完成。下載完成時間決定於你選擇的安裝包數量及網路連接速度,安裝我安裝的版本,約983M,下載完成後會自動安裝到上文設置的安裝目錄,安裝也要時間的,總時間較長,去吃個飯沒啥問題。
提醒:第四步的備份建議,盡量去做。如果有備份,第二步中選擇離線安裝。
驗證:
運行安裝目錄下的「Cygwin.bat」,第一次運行時,它會自動創建用戶信息,用戶信息存放在「.\Cygwin\home」中。
在運行「Cygwin.bat」打開的命令行窗口輸入:「cygcheck -c cygwin」命令,會列印出當前Cygwin的版本和運行狀態,如果status是ok的話,則cygwin運行正常。
分別輸入:「make –v」和,「gcc –v」命令如果檢測成功,會有make和gcc相關版本信息列印出來。

設置NDK路徑:
在windows的系統環境變數中添加NDK的路徑。使用「/cygdrive/d/Java/android-ndk-r8」這種Linux風格路徑,如果使用Windows下的「D:\Java\android-ndk-r8」,Cygwin在編譯時會發出警告。

運行Cygwin命令行,可以直接使用此環境變數,當然也可以手動的cd到該目錄:

使用NDK編譯程序:
現在我們用安裝好的NDK來編譯一個NDK提供的sample程序hello-jni(我的目錄位於:D:\Java\android-ndk-r8\samples\hello-jni)。
第一步:運行Cygwin,配置環境變數後可輸入「cd $ndk/samples/hello-jni/」,未配置則輸入命令「cd /cygdrive/d/java/android-ndk-r8/samples/hello-jni」,進入到「hello-jni」工程目錄。

第二步:編譯。輸入命令「$ndk/ndk-build」命令即可編譯。ndk-build是調用ndk的編譯程序。
關於下面的錯誤,我沒遇到,但是前人有總結,記錄如下:
錯誤:Android NDK: Host 'awk' tool is outdated。
解決方法:打開目錄「D:\Java\android-ndk-r8\prebuilt\windows\bin\」,刪除awk.exe(為保險起見請先備份)。

第三步:到」…/hello-jni/libs/armeabi「目錄下看有沒有生成的.so文件,如果有,你的ndk就運行正常啦!

導入NDK的hello-jni示例到Eclipse中:
第一步:在Eclipse中新建一個Android工程HelloJni。在Create Android Project時勾選「Create project from existing source」,Location中填「D:\Java\android-ndk-r8\samples\hello-jni」 (注意:在選擇API level時需要選擇1.5或更高的版本)。
第二步:直接以Android Aplication運行。這里要注意,你之前在使用NDK編譯程序時要把這個hello-jni編譯過並產生了.so文件,此處才能運行起來。

三、在Eclipse中集成C/C++開發環境CDT
CDT的安裝可以使我們在一個工程中,同時開發基於C/C++的Native代碼和基於Java語言的殼,之後的配置還可以使得一次編譯兩部分代碼。
下載:
下載地址:http://www.eclipse.org/cdt/downloads.php
說明:
Eclipse C/C++ IDE Indigo SR2:是帶CDT的Eclipse開發環境。
p2 software repository:在線安裝的地址。(似乎被河蟹爬了)
cdt-master-8.0.2.zip:這個是CDT的離線安裝包。(推薦使用這個,保留離線包,復用)

離線安裝:
Eclipse -> Help -> Install New Software,點擊add。Name:隨意,建議使用好記的「CDT_版本」。Location:點擊Archive,定位到下載的「cdt-master-8.0.2.zip」文件。
錯誤:
如果Location的下面出現「Duplicate location」錯誤,請到Window -> preferences -> Install/Update -> Avaliable Software Site中找到該條,remove之。
驗證:
安裝完成後,在Eclispe中新建一個項目,如果出現了C/C++項目,則表明CDT插件安裝成功了。

四、安裝Sequoyah插件
Sequoyah插件用於設置Android工程對Native開發的支持。
官方網址:http://www.eclipse.org/sequoyah/downloads/
在線安裝:
官網提供了用於在線安裝的Update Site地址以及安裝包的下載地址。貌似安裝包才1M多,在線安裝也沒被河蟹爬過,直接在線安裝了。勾選全部列出的可安裝項並完成安裝。
Location:http://download.eclipse.org/sequoyah/updates/2.0/

注意:
在安裝界面不要勾選「Group items by category」復選框,默認是勾選的,出現了列表為空(There are no categorized items)的情況。

配置:
安裝完Sequoyah插件後,為Android配置NDK路徑。
在「window –> preferences ->Android -> 本機開發」中添加NDK的路徑。

驗證:
右鍵之前建立的「HelloJni」項目,在「Android Tools」選項中包含「Add Native Support…」選項即成功。
五、JNI編譯環境配置
仍舊以之前建立的「HelloJni」為例,到目前為止,如果我們修改「/HelloJni/jni/hello-jni.c」文件,動態鏈接庫libhello-jni.so文件卻不會被重新編譯生成。這是因為我們沒有給JNI項目添加它需要的編譯配置和依賴庫。現在我們來配置它。
第一步:轉換工程。點擊「文件 -> 新建 -> 其他」(快捷鍵:Ctrl+N)。選擇「C/C++」下的「Convert to a C/C++ Project(Adds C/C++ Nature)」。進入「下一步」。

第二步:選中你剛才建的「HelloJni」工程,下面左邊選「Makefile project」右邊選「Cygwin GCC」。確定後提示的「透視圖」不清楚是什麼,點擊「是」即可。

第三步:在「HelloJni」工程上右鍵,選擇「屬性」。配置「C/C++ Build」和「C/C++ General -> Paths and Symbols」。
C/C++ Build:點擊「C/C++ Build」,在右邊的「Builder Settings」中去掉默認勾選的「Use default build command」復選框。設置Build command為「bash D:\Java\android-ndk-r8\ndk-build」。

C/C++ General -> Paths and Symbols:在Includes下add新的GNU C依賴路徑。此「HelloJni」工程需要「D:\Java\android-ndk-r8\platforms\android-8\arch-arm\usr\include」即可,以後根據不同項目選擇不同的依賴庫。

驗證:
將「/HelloJni/jni/hello-jni.c」中的字元串「Hello from JNI !」如改為「Hello JNI from Baron!」,運行後在模擬器上輸出的字元串改變即說明配置成功。

『肆』 如何在Android NDK中調用第三方庫文件(.so)

1.在project/jni目錄下創建prebuilt子目錄(目錄名可自定義).
2.將第三方.so放到prebuilt中,並創建Android.mk, 內容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := xxx
LOCAL_SRC_FILES := libxxx.so
include $(PREBUILT_SHARED_LIBRARY)
3.在project/jni/Android.mk中加入
LOCAL_SHARED_LIBRARIES := xxx
4.在project/jni/android.mk的最後加入
include $(LOCAL_PATH)/prebuilt/Android.mk
5.運行cygwin, 到project目錄下, 運行$NDK/ndk-build

『伍』 android ndk到底是什麼

NDK是一系列工具的集合。它提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk(AndroidPackage的縮寫,Android安裝包)。這些工具對開發者的幫助是巨大的。它集成了交叉編譯器,並提供了相應的mk文件隔離CPU、平台、ABI等差異,開發人員只需要簡單修改mk文件(指出「哪些文件需要編譯」、「編譯特性要求」等),就可以創建出so。它可以自動地將so和Java應用一起打包,極大地減輕了開發人員的打包工作。
NDK提供了一份穩定、功能有限的API頭文件聲明,Google明確聲明該API是穩定的,在後續所有版本中都穩定支持當前發布的API。從該版本的NDK中看出,這些API支持的功能非常有限,包含有:C標准庫(libc)、標准數學庫(libm)、壓縮庫(libz)、Log庫(liblog)。

『陸』 android studio中ndk編程怎麼使用庫文件

建立項目,並設置activity.xml布局文件,這一點與普通編程沒有不同。通過一個簡單的文本展示實驗。

在MainActivity中添加native介面,並載入.so庫

生成項目的.class文件。首先選中項目後,在菜單欄選擇Build-->Make Project。
Make之後,將生成.class文件,生成的.class文件位於app_path/build/intermediates/classes/debug/包名

利用javah生成C頭文件:點擊"View->Tool Windows->Terminal",即在Studio中進行終端命令行工具。在控制台中通過命令「cd app\src\main\java」,進入到java目錄下。操作指令:javah -d ../jni vrlab.ndkdemoforandroidstudio.MainActivity。此時在main目錄下生成一個jni文件夾,其中在jni文件夾中有生成的.h頭文件。

編輯C文件,在jni文件夾下新建文件命名為main.c。並在該文件中導入需要的頭文件,實現上一步生成的頭文件中的方法。

配置NDK路徑,在local.properties中指明sdk和ndk路徑:

設置ndk參數,名字、發布平台等。在應用目錄下的build.gradle中defaultConfig中設置

生成.so文件,此時再次選擇Build-->Build Project就可以生成so文件了。出現不支持NDK的錯誤提示,不過跟著錯誤提示修改:在項目空間下的gradle.properties中添加android.useDeprecatedNdk=true。

9
針對三種不同的CPU生成了三種不同的.so文件。生成的.so文件位於app_path/build/intermediates/ndk/debug/lib.

10
安裝運行

『柒』 「Android NDK 」是什麼,在什麼情況下使用

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

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

3、NDK的發布,使「Java+C」的開發方式終於轉正,成為官方支持的開發方式。

4、NDK將使Android平台支持C開發的開端。

NDK使得在android中,java可以調用C函數庫。我們都知道,java是半解釋型語言,很容易被反匯編後拿到源代碼文件,在開發一些重要協議時,我們為了安全起見,使用C語言來編寫這些重要的部分,來增大系統的安全性。還有,在一些接近硬體環境下,相信大家都清楚C與java的優劣。順帶提一下:NDK並不能顯著提升應用效率。why?我們都覺得C語言比起java來說效率要高出很多,一方面,隨著jdk的不斷更新,java的效率也隨之提高;另一方面,即便使用C語言編碼提高了應用效率,但是在java與C相互調用時平白又增大了開銷。

『捌』 Android-NDK:JNI本地文件中怎麼調試列印輸出到LOGCAT

加入頭文件
#include <android/log.h>
函數__android_log_print(ANDROID_LOG_INFO,LOG_TAG,TITLE)
第一個參數ANDROID_LOG_INFO(還有ANDROID_LOG_ERROR等),表示什麼類型
的輸出,上面的函數相當於android的java代碼的Log.i(LOG_TAG,TITLE),第二個參數就是logcat里的tag,第三個就是列印的內容。具體的請到log.h中自己查看。
Android之NDK開發
一、NDK產生的背景
Android平台從誕生起,就已經支持C、C++開發。眾所周知,Android的SDK基於Java實現,這意味著基於Android SDK進行開發的第三方應用都必須使用Java語言。但這並不等同於「第三方應用只能使用Java」。在Android SDK首次發布時,Google就宣稱其虛擬機Dalvik支持JNI編程方式,也就是第三方應用完全可以通過JNI調用自己的C動態庫,即在Android平台上,「Java+C」的編程方式是一直都可以實現的。
不過,Google也表示,使用原生SDK編程相比Dalvik虛擬機也有一些劣勢,Android SDK文檔里,找不到任何JNI方面的幫助。即使第三方應用開發者使用JNI完成了自己的C動態鏈接庫(so)開發,但是so如何和應用程序一起打包成apk並發布?這裡面也存在技術障礙。比如程序更加復雜,兼容性難以保障,無法訪問Framework API,Debug難度更大等。開發者需要自行斟酌使用。
於是NDK就應運而生了。NDK全稱是Native Development Kit。
NDK的發布,使「Java+C」的開發方式終於轉正,成為官方支持的開發方式。NDK將是Android平台支持C開發的開端。

二、為什麼使用NDK
1.代碼的保護。由於apk的java層代碼很容易被反編譯,而C/C++庫反匯難度較大。
2.可以方便地使用現存的開源庫。大部分現存的開源庫都是用C/C++代碼編寫的。
3.提高程序的執行效率。將要求高性能的應用邏輯使用C開發,從而提高應用程序的執行效率。
4.便於移植。用C/C++寫得庫可以方便在其他的嵌入式平台上再次使用。

三、NDK簡介
1.NDK是一系列工具的集合
NDK提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk。這些工具對開發者的幫助是巨大的。
NDK集成了交叉編譯器,並提供了相應的mk文件隔離CPU、平台、ABI等差異,開發人員只需要簡單修改mk文件(指出「哪些文件需要編譯」、「編譯特性要求」等),就可以創建出so。
NDK可以自動地將so和Java應用一起打包,極大地減輕了開發人員的打包工作。
2.NDK提供了一份穩定、功能有限的API頭文件聲明
Google明確聲明該API是穩定的,在後續所有版本中都穩定支持當前發布的API。從該版本的NDK中看出,這些API支持的功能非常有限,包含有:C標准庫(libc)、標准數學庫(libm)、壓縮庫(libz)、Log庫(liblog)。

『玖』 android開發,怎麼使用ndk編譯成.so文件

一、首先下載android-ndk,官方網站是:http://developer.android.com/tools/sdk/ndk/index.html
目前最新的版本是android-ndk-r8e-windows-x86.zip,下載地址:
http://dl.google.com/android/ndk/android-ndk-r8e-windows-x86.zip
下載後把壓縮包解壓出來,例如:D:\ndk,目錄下的ndk-build.cmd就是用來編譯的批處理命令。
二、編譯,打開cmd命令行窗口,cd進入目錄:D:\ndk\samples\hello-jni,
然後執行命令:D:\ndk\ndk-build.cmd(如果設置過環境變數則直接使用ndk-build.cmd)來編譯hello-jni,如果沒有錯誤會輸出:
Gdbserver : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup
"Compile thumb : hello-jni <= hello-jni.c
SharedLibrary : libhello-jni.so
Install : libhello-jni.so => libs/armeabi/libhello-jni.so
三、創建android應用程序並使用so文件
打開eclipse創建一個android應用程序HelloJni,默認的com.example.hellojni包下面有一個MainActivity.java,
在此包下添加一個HelloJni.java,

『拾』 如何為Android NDK的gradle構建文件中指定NDK

我一直在嘗試過解決這個問題。但在通過編寫自定義任務,使Android工作室在Eclipse中使用Application.mk和Android.mk就像結束了。
我的build.gradle看起來像這樣
應用插件:'com.android.application「安卓{ buildTypes {
發布 {
runProguard假
proguardFiles getDefaultProguardFile('proguard的-android.txt'),'proguard-rules.pro「
}
} compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
} compileSdkVersion 20
buildToolsVersion「20.0.0」 defaultConfig {
15的minSdkVersion
targetSdkVersion 20
版本code 1
} packagingOptions {
排除「META-INF /相關內容」
排除「META-INF / LICENSE」
排除「META-INF /注意事項」
} sourceSets.main {
jniLibs.srcDir'的src / main /庫「
jni.srcDirs = [] //禁用自動NDK的構建通話
}
}任務buildNative(類型:執行){
高清ndkBuild = NULL;
高清ndkBuildingDir =新的文件(「鋼骨混凝土/主/ JNI」);
高清hasNdk = FALSE;
如果(System.getenv(「NDK_BUILD_CMD」)!= NULL){
hasNdk = TRUE;
ndkBuild =新的文件(System.getenv(「NDK_BUILD_CMD」))
} 命令行ndkBuild,「--directory」,ndkBuildingDir doFirst {
如果(!hasNdk){
logger.error('##################')
logger.error(「NDK構建失敗!」)
logger.error('原因:NDK_BUILD_CMD未設置。')
logger.error('##################')
}
斷言hasNdk:「NDK_BUILD_CMD未設置。」
}
}
tasks.withType(JavaCompile){compileTask - &GT; compileTask.dependsOn buildNative}任務cleanNative(類型:執行){
高清ndkBuild = NULL;
高清ndkBuildingDir =新的文件(「鋼骨混凝土/主/ JNI」);
高清hasNdk = FALSE; 如果(System.getenv(「NDK_BUILD_CMD」)!= NULL){
hasNdk = TRUE;
ndkBuild =新的文件(System.getenv(「NDK_BUILD_CMD」))
} 命令行ndkBuild,「--directory」,ndkBuildingDir,「干凈」 doFirst {
如果(!hasNdk){
logger.error('##################')
logger.error(「NDK構建失敗!」)
logger.error('原因:NDK_BUILD_CMD未設置。')
logger.error('##################')
}
斷言hasNdk:「NDK_BUILD_CMD未設置。」
}
}
clean.dependsOn「cleanNative」

對於這個工作,你需要設置一個環境變數NDK_BUILD_CMD要設置的確切NDK建造可執行文件。
在Windows上,你可以設置環境變數NDK_BUILD_CMD點到你的NDK-build.exe
在Mac上,你在你的.bash_profile設置路徑變數不在GUI應用程序訪問(因此Android的Studio將無法讀取它們)。
所以,編輯你的.bash_profile是像
GRADLE_HOME = {} path_to_gradle
ANDROID_SDK_ROOT = {} path_to_sdk_dir
ANDROID_HOME = $ ANDROID_SDK_ROOT /平台的工具
ANDROID_NDK_HOME = {} path_to_ndk
NDK_BUILD_CMD = $ ANDROID_NDK_HOME / NDK的構建出口PATH=$GRADLE_HOME/bin:$ANDROID_HOME:$ANDROID_SDK_ROOT/tools:$ANDROID_NDK_HOME:/opt/local/bin:/opt/local/sbin:$PATHlaunchctl SETENV GRADLE_HOME $ GRADLE_HOME
launchctl SETENV ANDROID_HOME $ ANDROID_HOME
launchctl SETENV ANDROID_NDK_HOME $ ANDROID_NDK_HOME
launchctl SETENV NDK_BUILD_CMD $ NDK_BUILD_CMD

該launchctl線將使您的環境變數的Android Studio中可見。
PS:本.bash_profile中運行每次打開終端的時間。因此,對於這個正確與Android工作室工作,你需要啟動一次終端,然後運行Android的工作室。否則,構建就會失敗說NDK_BUILD_CMD未設置。我還沒有發現任何方式的Mac啟動時設置的值。如果有人能找到一個辦法,請隨時提出。

閱讀全文

與androidndk文檔相關的資料

熱點內容
農機空氣壓縮機 瀏覽:664
程序員下載歌曲 瀏覽:893
編譯未檢測到模擬器 瀏覽:807
壓縮機每次啟動12分鍾就停 瀏覽:730
creo復制曲面命令 瀏覽:959
程序員戀上女碩士 瀏覽:669
ansys的get命令 瀏覽:988
國外dns蘋果伺服器地址 瀏覽:430
國家職業技術資格證書程序員 瀏覽:652
奇瑞租車app是什麼 瀏覽:99
系統源碼安裝說明 瀏覽:420
命令行加殼 瀏覽:96
解壓時顯示防失效視頻已加密 瀏覽:295
蘋果簡訊加密發送 瀏覽:446
天翼私有雲伺服器租用 瀏覽:733
貴州雲伺服器屬於哪個上市公司 瀏覽:58
編程聯動教程 瀏覽:481
小天才app怎麼升級v242 瀏覽:545
簡單手工解壓玩具製作大全 瀏覽:928
免費編程電子書 瀏覽:870