ndkandroid
① Android NDK到底能做哪些有趣的事情
NDK全稱Native Development Kit,因而NDK本身主要是一套工具鏈。NDK裡麵包含了交叉編譯、鏈接、調試等的工具,以及一些比較基本的函數庫,如STL、標准C庫等,一些圖形的glue介面等,還有JNI的一些機制。
感覺題主所稱的NDK在實際的NDK之外,似乎還包含JNI機制和C/C++編程語言。
JNI是一種讓java層代碼和C/C++層代碼可以相互調用的機制,也就是Java層代碼可以調用C/C++,反過來也可以。不僅僅是Android開發可以用JNI這種機制,普通的PC機上的JAVA開發也可以用這種機制。
在Android app開發中使用C/C++語言,如同其他朋友所言,能帶來的好處很多,如利用遺留的相關庫,訪問底層操作系統介面等等。C/C++是這種開發中的核心。
至於說到有沒有必要,當然是具體看情況了。如果Android的Java層開發的知識的積累還非常少,當然應該先積累這方面的東西。對於許多對性能要求比較苛刻的應用領域,如其他朋友提到的音視頻編解碼,還有游戲的圖形什麼的使用NDK寫一些C/C++代碼可能比較好。要看別人優秀的使用了JNI機制和C/C++的開源項目,學一下一定是很有幫助的。
學習方法嘛,主要是分成NDK工具、JNI和 C/C++編程語言3個部分來看。
C/C++編程語言,自不必多說,和常規的 C/C++編程語言又沒有什麼特別的地方,主要的差別可能也就在可用的函數庫等方面了。
JNI的話,有一份叫 《The Java Native Interface Programmer's Guide and Specification》的文檔非常好,比較清楚的講解了Java代碼如何與C/C++代碼相互訪問的方法。
至於NDK,可以參考NDK自帶的文檔,或者android aosp項目中來了解如何編寫Android.mk。 參考NDK自帶的文檔來了解如何編譯,鏈接,調試,如何編寫Application.mk,如何使用STL等。還可以搜一下如何把NDK集成進自己使用的IDE中,如Eclipse,Android Studio等等。
② 如何給android工程添加ndk
建立項目,並設置activity.xml布局文件,這一點與普通編程沒有不同。通過一個簡單的文本展示實驗。在MainActivity中添加native介面,並載入.so庫生成項目的.class文件。首先選中項目後,在菜單欄選擇Build-->MakeProject。Make之後,將生成.class文件,生成的.class文件位於app_path/build/intermediates/classes/debug/包名利用javah生成C頭文件:點擊"View->ToolWindows->Terminal",即在Studio中進行終端命令行工具。在控制台中通過命令「cdapp\src\main\java」,進入到java目錄下。操作指令:javah-d../jnivrlab.ndkdemoforandroidstudio.MainActivity。此時在main目錄下生成一個jni文件夾,其中在jni文件夾中有生成的.h頭文件。編輯C文件,在jni文件夾下新建文件命名為main.c。並在該文件中導入需要的頭文件,實現上一步生成的頭文件中的方法。配置NDK路徑,在local.properties中指明sdk和ndk路徑:設置ndk參數,名字、發布平台等。在應用目錄下的build.gradle中defaultConfig中設置生成.so文件,此時再次選擇Build-->BuildProject就可以生成so文件了。出現不支持NDK的錯誤提示,不過跟著錯誤提示修改:在項目空間下的gradle.properties中添加android.useDeprecatedNdk=true。針對三種不同的CPU生成了三種不同的.so文件。生成的.so文件位於app_path/build/intermediates/ndk/debug/lib.安裝運行~~去吧,皮卡丘
③ 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到底是什麼
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)。
⑤ ndk跟android交互 不是同一個進程
以Windows環境為例,以下工具在使用NDK開發Android應用程序時都會要用到:
Java Development Kit on Windows
Apache Ant on Windows
Android SDK on Windows
Cywin on Windows
Android NDK on Windows
Eclipse on Windows
下載或安裝這些開發工具的時候,會需要將一些路徑配置到 Windows 系統的環境變數中,比如 JAVA_HOME, ANT_HOME,
ANDROID_SDK_HOME, CYWIN_HOME, ANDROID_NDK_HOME 和 path 等。
可以使用下載的 Android NDK on Windows 中找到示例(在 samples 目錄下)來進行學習和實踐。
Eclipse 對於提高開發程序的效率,下面簡要說明一下在Eclipse中使用 Android NDK on Windows
包中示例的方法流程:
在 Eclipse 的 Preferences 中指定 Android NDK 的位置。
使用 Import 導入 Android SDK 的 samples 目錄下面的某個示例工程。
使用 Android Tools 中的選項為示例工程增加對於 Native 的支持。
在 Android 虛擬機或者真機上運行示例工程,跟平常使用純的類 Java 代碼開發時的運行操作基本上差不多。
其實還可以使用命令行來構建 Native 代碼,涉及到 ndk-build 命令和 GNU make 的一些操作。 Android Native
工程中有兩個重要的 GNU make 文件:Android.mk, Application.mk。
使用 ndk-build 命令的時候可以在後面帶上 NDK_LOG=1 來在命令行窗口中列印出描述了 Android NDK
構建系統內部狀態的日誌。日誌信息都會以 「Android NDK:」 開頭。
如果只是對實際執行的構建指令感興趣,帶上 V=1 就可以了。
⑥ android ndk與sdk
1. SDK
Android SDK(Android Software Development Kit),即Android軟體開發工具包,Android的SDK基於Java實現,這意味著基於Android SDK進行開發的第三方應用都必須使用Java語言。但這並不等同於「第三方應用只能使用Java」,也就是說我們還可以採用C/C++語言。
2. NDK
NDK即Native Development Kit,眾所周知,Android程序運行在Dalvik虛擬機中,NDK允許用戶使用類似C / C++之類的原生代碼語言執行部分程序。
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)。
為什麼使用NDK
(1) 代碼的保護。由於apk的java層代碼很容易被反編譯,而C/C++庫反匯難度較大。
(2) 可以方便地使用現存的開源庫。大部分現存的開源庫都是用C/C++代碼編寫的。
(3) 提高程序的執行效率。將要求高性能的應用邏輯使用C開發,從而提高應用程序的執行效率。
(4)便於移植。用C/C++寫得庫可以方便在其他的嵌入式平台上再次使用。
⑦ android studio中的ndk是什麼意思
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 」是什麼,在什麼情況下使用
Android 應用是在dalvik虛擬機中運行的。NDK可以讓你使用本地代碼語言來開發應用,比如說C/C++,這種方法對某些類型的應用的是有好處的,可以充分利用本地代碼和在某些情況下加速代碼的執行。
對於絕大多數的應用來說,使用NDK並不是一個明智的選擇,作為一個開發者,我們需要衡量它所帶來的好處和缺點。使用本地代碼並不一定可以使性能得到優化,但是通常使得應用代碼變得復雜。一般來說,我們將應用中關鍵部分的代碼用C/C++寫,而不能由於我們習慣於用C/C++開發而把所有的代碼都用C/C++來實現。
有下面這些特點的應用可以考慮使用NDK:
1 獨立的,不和其他應用有關系的
2 頻繁佔用CPU但是申請的內存空間不是很大的操作,像信號的處理,物體的模擬等等
簡單的用C/C++重寫我們的代碼是不會帶來很大的性能提升的。
在考慮是否採用本地代碼開發的時候,要結合應用的實際需求並且看看Android 的framework層是否提供了我們需要的API,但是用NDK可以充分利用本地已經有的代碼。
Android framework提供下面兩種方法來使用本地代碼:
1 在Android framework的框架下面開發應用,使用JNI的方法來使用NDK本地方法提供的API。這樣的好處就是我們可以很好的利用的Android的framework提供的框架,但是需要編寫本地具體實現的代碼。這樣的APK可以在Android 1.5及其之後的版本上面運行。
2 寫一個本地的Activity,在本地代碼中實現生命回調函數,AndroidSDk提供了
類,這個類可以方便的讓你在你的本地代碼中實現回調函數(OnCreate,OnPause),從而當這些事件發生的時候處理。
⑨ android ndk是什麼
android是安卓的縮寫,NDK是日本電波工業株式會社的英文縮寫,Android NDK 是在SDK前面又加上了「原生」二字,即Native Development Kit,因此又被Google稱為「NDK」。
Android程序運行在Dalvik虛擬機中,NDK允許用戶使用類似C / C++之類的原生代碼語言執行部分程序。NDK包括以下方面:
1、從C / C++生成原生代碼庫所需要的工具和build files。
2、將一致的原生庫嵌入可以在Android設備上部署的應用程序包文件(application packages files ,即.apk文件)中。
3、支持所有未來Android平台的一系列原生系統頭文件和庫。
(9)ndkandroid擴展閱讀:
NDK的產品優勢:
1、NDK擁有培育人工水晶的豐富經驗。而好的人工水晶決定了優質晶振產品的一半的品質。
2、NDK晶振產品尺寸、規格全面,既可滿足中小型、超小型電子元器件的要求,也適用於各類規格要求的細分市場。
3、NDK晶體諧振器、晶體振盪器具有非常優越的頻率一致性和穩定性。特別在汽車電子市場,即使在嚴峻的寬溫(-40度到150度)和震動撞擊環境下,都能保持良好的穩定性。
參考資料來源:網路:NDK
⑩ android如何使用ndk
程序中一些邏輯是用C寫的,使用jni調用C代碼,使用基本的打log的方式很難查看大型數組,了解到android ndk sdk中有個工具叫ndk-gdb可以很方便地對c代碼進行調試,使用過程並不順利,遇到兩個錯誤,耗時一周終於解決。如果是在windows下,需要安裝cygwin。首先,在cygwin命令行下進入到你工程的根目錄下如果你要調試的程序已經在運行了,直接運行ndk-gdb
如果你要調試的程序沒有運行,可以使用ndk-gdb --start
鍵入ndk-gdb命令,會出現一系列庫文件載入的信息,這些庫可能會載入失敗,不過沒有關系
出現<gdb>提示符,輸入help命令可以查看一系列命令使用l命令列出c文件的內容,但是遇到 No symbol table is loaded. Use the "file" command.使用以下命令載入需要調試的so文件:
file obj/local/armeabi/libsearch-algorithm.so使用list或者l可以查看載入的c文件。使用b 100,在c文件的第100行設置斷點。
使用c或者continue命令繼續運行程序。
出現錯誤:Continuing.
Warning:Cannot insert breakpoint 1.
Error accessing memory address 0x11a0: Input/output error.錯誤原因:使用ndk-gdb --start 啟動程序第一個activity,但是此時so文件並沒有被載入。
解決方法:首先打開程序並使用,在保證so文件已經被使用的情況下,調用ndk-gdb命令調試程序進程。
正確流程:
1.創建一個模擬器或者使用真機運行想要調試的程序,確保so文件已經被載入。
2.在此程序的根目錄下調用ndk-gdb,出現gdb提示符。
3.使用l命令,應該可以列印出c文件。
4.使用b 10,可以在c文件的第十行列印斷點。
5.使用c命令恢復程序運行。