目标:在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
以上我们的环境搭建完成了。