android ndk 验证包名和签名

2,043 阅读2分钟

(一)创建一个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进行操作

  1. 找到Context类,调用方法GetObjectClass, jclass context = env->GetObjectClass(mContext);

  2. 找到getPackageName方法,调用GetMethodID,jmethodID packageNameMethod = env->GetMethodID(context, "getPackageName", "()Ljava/lang/String;");第一个参数是在哪个类中去查找,第二个参数表示方法的名字,第三个参数表示方法的参数和返回值

  3. 使用Context的对象去调用找到的方法,auto pnString = (jstring) env->CallObjectMethod(mContext, packageNameMethod); 然后把jstring转化为c++类型的字符串 

  4. 将获取到的包名和定义的常量包名去比较,如果相同,执行下一步,签名校验,如果不同,直接返回错误

  5. 我们在Java层,获取签名,如下图

  6. 将getRawSignature方法转化为c++代码,获取PackageManager对象,然后获取PackageInfo对象,获取PackageInfo对象里面的signatures属性的值,调用toCharsString,就是我们需要校验的签名,代码如下把自己写的cpp文件添加到CMakeLists文件中

  7. 在原声页面中去调用

    就可以完成包名和签名的验证了