NDK: NativeDevelopment Kit
Android程序運行在Dalvik虛擬機中,NDK允許用戶使用類似C /C++之類的原生代碼語言執行部分程序。
NDK包括了:
從C / C++生成原生代碼庫所需要的工具和build files。
將一致的原生庫嵌入可以在Android設備上部署的應用程序包文件(application packages files ,即.apk文件)中。
支持所有未來Android平台的一些列原生系統頭文件和庫
使用NDK的理由:
1. 代碼的保護,由於apk的java層代碼很容易被反編譯,而C/C++庫反匯難度較大。
2. 在NDK中調用第三方C/C++庫,因為大部分的開源庫都是用C/C++代碼編寫的。
3. 便於移植,用C/C++寫得庫可以方便在其他的嵌入式平台上再次使用。
上面內容摘自百度百科。
有天有個哥們找到我,考慮到java的apk不夠安全,想將協議部分封裝到so庫文件中,需要做個技術前期驗證,看看效果如何,於是有了下面的示例。
這個示例分步驟實現了:
1. java調用.so文件
2. 顯示char數組的字符串
3. 不同進制顯示char數組
4. java調用so從本地返回char數組
5. java傳遞char數組給so,然後so修改後再返回char數組給java
基本步驟是:
/* 1. 先編寫java文件,定義好本地函數名稱和參數;
* 2. cd C:\LHANDROID\code\hello
* 3. md jni;
* 4. 運行項目,編譯HelloJni.java,或者手工使用javac編譯,在目錄
* C:\LHANDROID\code\Hello\bin\classes\com\example\hello
* 中生成HelloJni.class
* 5. 根據HelloJni.class中本地函數的定義生成c語言頭文件:
cd C:\LHANDROID\code\Hello\
javah -classpath bin\classes -d jni com.example.hello.HelloJni
* 6. 根據生成頭文件cd C:\LHANDROID\code\Hello\jni\com_example_hello_HelloJni.h
中的定義,編寫hello-jni.c的函數定義;
* 7. 拷貝一個Android.mk到jni中修改
* 8. 編譯:C:\LHPROGRAM\android-ndk-r8d\ndk-build.cmd
結果:
C:\LHANDROID\code\hello>C:\LHPROGRAM\android-ndk-r8d\ndk-build.cmd
C:/LHPROGRAM/android-ndk-r8d/build/core/add-application.mk:128: Android NDK: WAR
NING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8 in ./Androi
dManifest.xml
"Compile thumb : hello-jni <= hello-jni.c
SharedLibrary : libhello-jni.so
Install : libhello-jni.so => libs/armeabi/libhello-jni.so
* 9. 直接編譯運行apk
*
*/
建議:
最初覺得自己對c/c++還算熟悉,結果發現其實會那個還遠遠不夠,核心的問題是要搞清楚那個jni.h,明白java的數據類型在ndk中的映射,同時知道對該類型的操作方法。強烈建議仔細看看jni.h文件。
GOD BLESS U!
示例參考下載:
免費下載地址在 http://linux.linuxidc.com/
用戶名與密碼都是www.linuxidc.com
具體下載目錄在 /2013年資料/10月/13日/Android的NDK開發入門示例
下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm