什么是NDK
NDK全称是Native Development Kit,NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和Java应用一起打包成apk。NDK集成了交叉编译器(交叉编译器需要UNIX或Linux系统环境),并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。
为什么使用NDK
1、代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
2、可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。
3、提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。
4、便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。
JNI
JNI的全称是Java Native Interface,它提供了若干的API实现了Java和其他语言的通信(主要是C和C++)。
为什么使用JNI?
JNI的目的是使java方法能够调用c实现的一些函数。
安卓中的so文件是什么?
Android中用到的so文件是一个c++的函数库。在android的JNI中,要先将相应的C语言打包成so库,然后导入到lib文件夹中供java调用。
Android Studio NDK及so文件开发
JNI使用方法
- 新建一个支持c语言的工程
- 然后在创建native方法
public native int add(int a,int b);
public native int subtract(int a,int b);
public native int multiply(int a,int b);
public native int divide(int a,int b);
第一次创建这些方法报错,因为你在c里面没有这些方法而且.h文件里面也没有
* 创建.h文件打开Terinal到你写nitive方法的目录下输入
//javah -jni 包名类名
javah -jni liuhongliang.bawei.com
.jnidemo.MainActivity
- 接下来就开始写c的代码
- 在app下新建jni文件夹,里面新建demo.c文件和Android.mk
文件
以下是Android.mk
文件代码
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := demo
LOCAL_SRC_FILES := demo.c
include $(BUILD_SHARED_LIBRARY)
以下是demo.c文件代码,里面自定义了以下方法,我定义的是加减乘除
#include <jni.h>
jint
Java_liuhongliang_bawei_com_jnidemo_MainActivity_add(JNIEnv *env,jobject thiz,int a,int b) {
return a+b;
}
jint
Java_liuhongliang_bawei_com_jnidemo_MainActivity_subtract(JNIEnv *env,jobject thiz,int a,int b) {
return a-b;
}
jint
Java_liuhongliang_bawei_com_jnidemo_MainActivity_multiply(JNIEnv *env,jobject thiz,int a,int b) {
return a*b;
}
jint
Java_liuhongliang_bawei_com_jnidemo_MainActivity_divide(JNIEnv *env,jobject thiz,int a,int b) {
return a/b;
}
最后到你jni文件目录下输入
ndk-build
接下来就可以调用c语言的方法了