自检程序写在so里

主要代码

在文件头中导入

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)#include <jni.h>#include<android/log.h>#include <string.h>#include <unistd.h>#endif

然后在cpp中写入Java调用c的接口

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)extern "C"{JNIEXPORT jint JNICALL Java_org_cocos2dx_cpp_AppActivity_checkAPK(JNIEnv *env, jclass jcl,jobject context_object) {jclass context_class = env->GetObjectClass(context_object);//context.getPackageManager()jmethodID methodId = env->GetMethodID(context_class, "getPackageManager", "()Landroid/content/pm/PackageManager;");jobject package_manager_object = env->CallObjectMethod(context_object, methodId);if (package_manager_object == NULL) {__android_log_print(ANDROID_LOG_INFO, "JNITag","getPackageManager() Failed!");return NULL;}//context.getPackageName()methodId = env->GetMethodID(context_class, "getPackageName", "()Ljava/lang/String;");jstring package_name_string = (jstring)env->CallObjectMethod(context_object, methodId);if (package_name_string == NULL) {__android_log_print(ANDROID_LOG_INFO, "JNITag","getPackageName() Failed!");return NULL;}env->DeleteLocalRef(context_class);//PackageManager.getPackageInfo(Sting, int)jclass pack_manager_class = env->GetObjectClass(package_manager_object);methodId = env->GetMethodID(pack_manager_class, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");env->DeleteLocalRef(pack_manager_class);jobject package_info_object = env->CallObjectMethod(package_manager_object, methodId, package_name_string, 64);if (package_info_object == NULL) {__android_log_print(ANDROID_LOG_INFO, "JNITag","getPackageInfo() Failed!");return NULL;}env->DeleteLocalRef(package_manager_object);//PackageInfo.signatures[0]jclass package_info_class = env->GetObjectClass(package_info_object);jfieldID fieldId = env->GetFieldID(package_info_class, "signatures", "[Landroid/content/pm/Signature;");env->DeleteLocalRef(package_info_class);jobjectArray signature_object_array = (jobjectArray)env->GetObjectField(package_info_object, fieldId);if (signature_object_array == NULL) {__android_log_print(ANDROID_LOG_INFO, "JNITag","PackageInfo.signatures[] is null");return NULL;}jobject signature_object = env->GetObjectArrayElement(signature_object_array, 0);env->DeleteLocalRef(package_info_object);//Signature.toCharsString()jclass signature_class = env->GetObjectClass(signature_object);methodId = env->GetMethodID(signature_class, "hashCode", "()I");env->DeleteLocalRef(signature_class);int signature_string = env->CallIntMethod(signature_object, methodId);HelloWorld::hashCode = signature_string;return signature_string;}}#endif


HelloWorld中的hashCode就是我们自检的结果,程序运行时检测hashCode是否与签名时的一致即可

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. Android-自带Theme样式
  3. Android动画Animation之Tween用代码实现动画效果
  4. Android(安卓)Studio 统计代码行数插件 — Statistic
  5. android : Session 'app': Error Installing APK
  6. 修改android4.4图库系列二——自定义菜单
  7. Android(安卓)JNI(实现自己的JNI_OnLoad函数)
  8. Android(安卓)代码中对不同国家支持的信道的设置
  9. Android系统横竖屏切换时候Activity的生命周期

随机推荐

  1. Free Android UI library & component ro
  2. [转]android颜色对应的xml配置值
  3. Android SDK r23
  4. ListView实用参数
  5. Android开发网站被封解决方案
  6. Android 第三方库混淆proguard-rules,持续
  7. QT android platform SDK installed erro
  8. 如何查看USB方式连接Android设备的外接设
  9. Android SDK 源代码编译
  10. android webrtc构建过程