手动注册native方法

前言

这大雾何时会散去!?


实践

注册native方法有两种实现方法,一种是默认的,如JNIEXPORT void JNICALL Java_com_code_jsk_handlenative_MainActivity_checkSign ,在JNI_OnLoad 会自动识别该方法,从而进行注册。这种方式虽然方便了编程,但同时也让破坏者找到了进攻的路口。
手动注册的好处是native方法的命名可以随意。
参考文章

代码

public native int  obviousEqual();
public native void checkJSK();
#include 
#define JNIREG_CLASS "com/code/jsk/handlenative/MainActivity"//指定要注册的类
static JNINativeMethod gmethod[] = {
        {"obviousEqual","()I",(void*)jiangsikang},
};
/*
* Register several native methods for one class.
*/
static int registerNativeMethods(JNIEnv* env, const char* className,
                                 JNINativeMethod* gmethod, int numMethods)
{
    jclass clazz;
    clazz = env->FindClass(className);
    if (clazz == NULL) {
        return JNI_FALSE;
    }
    if (env->RegisterNatives(clazz, gmethod, numMethods) < 0) {
        return JNI_FALSE;
    }

    return JNI_TRUE;
}
/*
* Register native methods for all classes we know about.
*/
static int registerNatives(JNIEnv* env)
{
    if (!registerNativeMethods(env,JNIREG_CLASS, gmethod,
                               sizeof(gmethod) / sizeof(gmethod[0])))
        return JNI_FALSE;
    JNINativeMethod smethod[] = {
            {"checkJSK","()V",(void*)checkJSK},
    };
    if (!registerNativeMethods(env,JNIREG_CLASS, smethod,
                               sizeof(smethod) / sizeof(smethod[0])))
        return JNI_FALSE;
    return JNI_TRUE;
}
/*
* Set some test stuff up.
*
* Returns the JNI version on success, -1 on failure.
*/

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
{
    JNIEnv* env = NULL;
    jint result = -1;

    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
        return -1;
    }
    assert(env != NULL);

    if (!registerNatives(env)) {//注册
        return -1;
    }

    result = JNI_VERSION_1_4;

    return result;
}

我们只需要修改static int registerNatives(...)这个函数即可.
原理我不懂,拿这个模板套吧。

总结

给自己点压力,真的!

你可能感兴趣的:(android)