(一)创建一个Native c++ 运行工程
步骤如下打开Android Studio =>File => New Project = > Native C++ =>Next=>package name=>next=>Finish,工程创建完毕,默认会在cpp文件夹下生成两个文件CMakeLists.txt
和native-lib.cpp,CMakeLists是一些library的配置信息,简单介绍一下add_library ,native-lib是
生成的so库的名字,前面拼接lib,举例生成的名字为libnative-lib.so,SHARED表示是分享的library,native-lib.cpp表示你的C++代码的源文件
native-lib.cpp ,默认添加了一个stringFromJNI,会返回一个字符串给原声调用,在调用的地方要把生成的so加载进来,声明native方法,然后调用native方法,如下图
(二)实现包名验证个签名验证
1,创建一个signature-native-lib.cpp文件,实现包名和签名验证的源码文件
2,创建一个类包含一个native方法signatureCheck
使用Android studio的快捷键操作 ,自动生成实现方法如下图
3,signatureCheck方法的实现
1,定义两个常量,需要校验包名和签名
获取包名和我们自定义的包名去比较
在原声中,使用context来获取包名,context.getPackageName(),然后翻译成c++代码来调用,
我们使用传过来的参数context进行操作
-
找到Context类,调用方法GetObjectClass, jclass context = env->GetObjectClass(mContext);
-
找到getPackageName方法,调用GetMethodID,jmethodID packageNameMethod = env->GetMethodID(context, "getPackageName", "()Ljava/lang/String;");第一个参数是在哪个类中去查找,第二个参数表示方法的名字,第三个参数表示方法的参数和返回值
-
使用Context的对象去调用找到的方法,auto pnString = (jstring) env->CallObjectMethod(mContext, packageNameMethod); 然后把jstring转化为c++类型的字符串
-
将获取到的包名和定义的常量包名去比较,如果相同,执行下一步,签名校验,如果不同,直接返回错误
-
我们在Java层,获取签名,如下图
-
将getRawSignature方法转化为c++代码,获取PackageManager对象,然后获取PackageInfo对象,获取PackageInfo对象里面的signatures属性的值,调用toCharsString,就是我们需要校验的签名,代码如下
把自己写的cpp文件添加到CMakeLists文件中
-
在原声页面中去调用
就可以完成包名和签名的验证了