歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android的NDK開發入門示例

Android的NDK開發入門示例

日期:2017/3/1 9:52:13   编辑:Linux編程

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

Copyright © Linux教程網 All Rights Reserved