• JNI 动态注册


    java代码:

    //Application类,壳入口
    public class MainApplication extends Application {
        
        public native void Decrypt(Context context);
        public native Object DymLoad(Context context);
        
        static{
            System.loadLibrary("AndriodShell");
        }
    
        @Override
        protected void attachBaseContext(Context base) {
            super.attachBaseContext(base);
            
            //调用JNI,解密DEX
            Decrypt(base);
            
            //调用JNI,动态加载DEX
            DymLoad(base);
        }
    }

    JNI代码:

    /***************************************************************************************
    *
    * 定义一个全局数组,保存Java到JNI的映射关系
    *
    ****************************************************************************************/
    // Java和JNI绑定表(JIN动态注册)
    static JNINativeMethod method_table[] = {
                { "Decrypt", "(Landroid/content/Context;)V", (void*) sub_1111 },
                { "DymLoad","(Landroid/content/Context;)Ljava/lang/Object;", (void*) sub_2222 }
            };
    
    
    /***************************************************************************************
    *
    * 函数实现
    *
    ****************************************************************************************/
    //动态库入口
    JNIEXPORT
    jint
    JNI_OnLoad(JavaVM* vm, void* reserved)
    {
        JNIEnv* env = NULL;
        jint result = -1;
    
        if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK)
        {
            return result;
        }
    
        //动态注册JNI
        register_ndk_load(env);
    
        return JNI_VERSION_1_4;
    }
    
    
    //解密dex
    JNIEXPORT
    void
    JNICALL
    sub_1111(JNIEnv* env, jobject thiz, jobject context)
    {
        
    }
    
    
    //动态加载DEX
    JNIEXPORT
    jobject
    JNICALL
    sub_2222(JNIEnv* env, jobject thiz, jobject context)
    {
        return get_get_obj;
    }
    
    
    //动态注册JNI
    int
    register_ndk_load(JNIEnv *env)
    {
        //动态注册JNI
        return registerNativeMethods(env, JNIREG_CLASS, method_table, NELEM(method_table));
    }
    
    
    //动态注册JNI
    static
    int
    registerNativeMethods(JNIEnv* env, const char* className, JNINativeMethod* gMethods, int numMethods)
    {
        jclass clazz;
        clazz = env->FindClass(className);
        if (clazz == NULL)
        {
            return JNI_FALSE;
        }
    
        //调用JNIEnv函数,动态注册JNI
        if (env->RegisterNatives(clazz, gMethods, numMethods) < 0)
        {
            return JNI_FALSE;
        }
    
        return JNI_TRUE;
    }
  • 相关阅读:
    如何实现Android欢迎页
    创建webapi的简单步骤
    IOS里Request的斗争(上)
    预告:关于接下来的部分,都是番外。
    利用Selenium制作python数据抓取,以及对Selenium资源介绍
    利用openpyxl来读取Excel数据
    在pycharm下快速添加插件
    C# 分布式缓存服务器方案
    2014中国省市数据库
    FormsAuthentication 登录兼容 IE11 保存cookie
  • 原文地址:https://www.cnblogs.com/luzhiyuan/p/4474364.html
Copyright © 2020-2023  润新知