目標:在android app中調用自己的c代碼,這個c代碼會以動態庫的形式存在,並且爲了表示更廣泛的使用場景,我們的c程序會使用第三方庫(openssl),這也是我們開發中經常用的方式。
功能:c代碼就是將openssl中的MD5直接封裝,並以字符串形式輸出MD5值。android代碼調用jni接口,並將MD5值輸出到手機屏幕。
對象:新手入門,可以通過本教程一步一步完成整個過程,但是可能會遇到文章中沒有提到的問題,這個也是正常的,因爲版本和環境原因,遇到問題可以留言討論。
基礎概念
NDK 是Native Develop Kit的含義,從含義很容易理解,本地開發。Android NDK 就是一套工具集合,允許你使用C/C++語言來實現應用程序的部分功能。一般情況,是用NDK工具把C/C++編譯爲.so文件,然後在Java中調用。
該圖非常清晰的表示了上層通過JNI來調用NDK層的。
JNI,全稱爲Java Native Interface,即Java本地接口,JNI是Java調用Native 語言的一種特性。通過JNI可以使得Java與C/C++機型交互。即可以在Java代碼中調用C/C++等語言的代碼或者在C/C++代碼中調用Java代碼。
步驟
1、下載NDK
在網站https://developer.android.google.cn/ndk/downloads下載
我下載的是當時最新穩定版 (r21) android-ndk-r21-linux-x86_64.zip
2、創建工作目錄
創建NDK工具目錄
mkdir AndroidWorkSpace/NDK_Tools -p
cd AndroidWorkSpace/NDK_Tools
3、拷貝並解壓ndk工具
將android-ndk-r21-linux-x86_64.zip拷貝到該目錄下
unzip android-ndk-r21-linux-x86_64.zip
解壓後的文件夾是:android-ndk-r21
4、配置環境變量
進入andorid-ndk-r21
cd android-ndk-r21
查看當前路徑:pwd
/home/rtp/android/AndroidWorkSpace/NDK_Tools/android-ndk-r21
這是我的路徑
vim ~/.bashrc
在文件末尾添加下面兩行代碼,將上面的路徑添加到PATH環境變量中
export ANDROID_NDK=/home/rtp/android/AndroidWorkSpace/NDK_Tools/android-ndk-r21
export PATH=$ANDROID_NDK:$PATH
保存退出
5、測試
關閉當前Terminal並打開一個新的Terminal
通過: ndk-build -v 指令測試是否成功安裝
GNU Make 4.2.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
6、編譯測試
嘗試用ndk-build 命令編譯sample目錄下的jni工程:
sample在r10b中提供,可以用來進行測試
cd AndroidWorkSpace/NDK_Tools/android-ndk-r10b/samples/hello-jni
ndk-build
Android NDK: Found platform level in ./default.properties. Setting APP_PLATFORM to android-3.
Android NDK: android-3 is unsupported. Using minimum supported version android-16.
Android NDK: WARNING: APP_PLATFORM android-16 is higher than android:minSdkVersion 3 in ./AndroidManifest.xml. NDK binaries will *not* be compatible with devices older than android-16. See https://android.googlesource.com/platform/ndk/+/master/docs/user/common_problems.md for more information.
[arm64-v8a] Gdbserver : [aarch64-linux-android] libs/arm64-v8a/gdbserver
[arm64-v8a] Gdbsetup : libs/arm64-v8a/gdb.setup
[x86_64] Gdbserver : [x86_64-linux-android] libs/x86_64/gdbserver
[x86_64] Gdbsetup : libs/x86_64/gdb.setup
[armeabi-v7a] Gdbserver : [arm-linux-androideabi] libs/armeabi-v7a/gdbserver
[armeabi-v7a] Gdbsetup : libs/armeabi-v7a/gdb.setup
[x86] Gdbserver : [i686-linux-android] libs/x86/gdbserver
[x86] Gdbsetup : libs/x86/gdb.setup
[arm64-v8a] Compile : hello-jni <= hello-jni.c
[arm64-v8a] SharedLibrary : libhello-jni.so
[arm64-v8a] Install : libhello-jni.so => libs/arm64-v8a/libhello-jni.so
[x86_64] Compile : hello-jni <= hello-jni.c
[x86_64] SharedLibrary : libhello-jni.so
[x86_64] Install : libhello-jni.so => libs/x86_64/libhello-jni.so
[armeabi-v7a] Compile thumb : hello-jni <= hello-jni.c
[armeabi-v7a] SharedLibrary : libhello-jni.so
[armeabi-v7a] Install : libhello-jni.so => libs/armeabi-v7a/libhello-jni.so
[x86] Compile : hello-jni <= hello-jni.c
[x86] SharedLibrary : libhello-jni.so
[x86] Install : libhello-jni.so => libs/x86/libhello-jni.so
以上我們的環境搭建完成了。