在这篇博客中,我将利用NDK调用JNI来使用本地c语言实现的一个简单的加密程序,主要是为了熟悉NDK和JNI的使用方法,希望可以让后来人少踩一些坑。
系统环境:
Android Studio 2.3.3
jdk1.8.0
android-ndk-r14b-windows-x86_64
配置NDK环境
下载NDK和配置环境变量在此不做赘述,不会的可以自行百度
在Android Studio中File–>ProjectStructure–>SDK Location配置“Android NDK Location”如下图:
配置gradle.properties和build.gradle文件
在项目目录下gradle.properties文件中加入
android.useDeprecatedNdk=true
修改app–>build.gradle,添加以下内容:
在defaultConfig中添加ndk项,这里moduleName是将来生成.so文件的名字,abiFilters是生成指定平台的so文件,如果不写abiFilters会生成所有平台的so文件
ndk {
moduleName "Crypto"
abiFilters "armeabi"
}
在buildTypes中添加sourceSets项,配置so文件存放位置
sourceSets {
main {
jni.srcDirs = ['libs']
}
}
添加native方法
public class Crypto {
static {
System.loadLibrary("Crypto");
}
public native String encrypt(String prim);
public native String decrypt(String code);
}
这里我们添加两个方法供以后使用,注意这里loadLibrary要和build.gradle中moduleName一致
使用javah生成对应.h头文件
在Android Studio下方Terminal进入java路径(直接将文件夹拖到命令行就进入该目录了),如果没有Terminal,从View–>Tool Windows–>Terminal打开即可。
输入命令javah -jni 包名.类名
javah -jni com