android的ndk開發入門示例


 

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章