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://download.csdn.net/detail/testingba/5203811