ndk的环境配置就不写了,网上很多
首先新建一个项目,然后在包名下新建一个类,定义自己需要的native方法
public class SingatureClass {
//验证包名
public native String verificationPackage(Object context);
//验证签名
public native String verificationSign(Object context);
}
其次要获取到项目的签名值
这里需要注意的地方是debug包和release包的签名是不一样的,如果要获取release包的签名值,则需要把该方法生成的签名值先写入本地日志, 然后从日志中获取签名值,将获取到的签名值复制到.c文件中
public static String getSignature(Context context) {
try {
/** 通过包管理器获得指定包名包含签名的包信息 **/
PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);
/******* 通过返回的包信息获得签名数组 *******/
Signature[] signatures = packageInfo.signatures;
/******* 循环遍历签名数组拼接应用签名 *******/
return signatures[0].toCharsString();
/************** 得到应用签名 **************/
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return null;
}
接下来生成.h文件
打开Terminal,
输入cd app/src/main/java,键入Enter
然后输入javah -d ../jni -classpath . -jni 包名.类名
如果出现错误:“错误: 编码GBK的不可映射字符”,
则输入javah -d ../jni -classpath . -jni -encoding UTF-8 包名.类名
在main目录下新建jni文件夹,将生成的.h文件移动到jni目录下
然后在jni目录先新建c/c++文件
将.h中的生成的方法复制到新建的c文件中,并且添加引用
将签名值和包名进行赋值
下面贴出代码
#include "com_lee_signatureencryption_SingatureClass.h"
#include <jni.