0x01前言
- NDK全称是Native Development Kit,NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。
- JNI的全称是Java Native Interface,它提供了若干的API实现了Java和其他语言的通信(主要是C和C++)。
- NDK 无需翻墙下载链接:点击打开链接
0x02配置NDK环境变量
把下载好的 NDk解压到SDK文件夹下的,并改名为ndk-bundle,这样AS每次启动能自动解析- 在系统变量中创建NDK_ROOT
- 在系统环境变量Path后追加%NDK_ROOT%
- NDK配置成功标志
在cmd中输入ndk-build,出现下面两行则表示配置成功(虽然是报错消息,这个命令是基于project中执行的,后面会看到。所以直接在cmd中执行会报错,但已经能被cmd识别,说明配置成功)
0x03JNI的使用方法
- 在MainActivity.java中建立一个方法:
public native String getStringFromJNI();
- 编译该类得到对应.h文件
在Terminal中输入javah -jni 包名.类名
(图3-2-1)
(图3-2-2)
说明:该.h文件只是为了辅助我们写出相应的.c文件,使用完了即可删除。
里面最关键的是这句代码
JNIEXPORT jstring JNICALL Java_com_lostck_jnidemo_MainActivity_getStringFromJNI (JNIEnv *, jobject);
-
编写.c文件
- 编写Android.mk文件
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := demo LOCAL_SRC_FILES := demo.c include $(BUILD_SHARED_LIBRARY)
- 编译so文件
0x04生成并测试apk
- 两个必要设置
1)在local.properties中添加ndk路径,如果前面ndk环境配置好的话这里会自动配置
2)在app的build.gradle的android节点下设置 - 使用so文件
说明:这个库demo(完整的名字是libdemo.so)会在第一次使用MainActivity这个类的时候加载。(static代码块声明的代码会先于onCreate方法执行) - 测试生成的apk
Perfect,成功!
0x05总结
JNI不在神秘,安卓之路,我在路上。2018年3月11日 13:26:42