Полная собственная реализация

#java #android #java-native-interface #overriding #native

Вопрос:

Я разрабатываю приложение с помощью JNI, чтобы предотвратить сторонние изменения. Я продвинулся в направлении регистрации собственных методов, чтобы удалить мостовые связи jni, но, как вы можете видеть, методы с атрибутом override по-прежнему должны существовать в коде Java как встроенные связанные. Есть ли способ полностью перенести оставшийся java-код для этого конкретного файла?

Java:

 @Override
protected native void onCreate(Bundle savedInstanceState);
 

CPP:

 void onCreate(JNIEnv *env, jobject classObject, jobject bundle) {
    /**super.onCreate**/
    gObjects[0] = env->NewGlobalRef(classObject);
    gClasses[0] = env->GetObjectClass(gObjects[0]);
    jclass s_Class = env->GetSuperclass(gClasses[0]);
    jmethodID oc_ID = env->GetMethodID(s_Class, "onCreate", "(Landroid/os/Bundle;)V");
    env->CallNonvirtualVoidMethod(gObjects[0], gClasses[0], oc_ID, bundle);
}

extern "C" JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *curVM_, void *reserved) {
    curVM = curVM_;
    curVM->GetEnv((void **) amp;environments[0], JNI_VERSION_1_6);

    /**Start of Native Method Registers**/
    JNINativeMethod natives[1];
    uint64_t pCount = sizeof(natives) / sizeof(natives[0]);
    jclass klass = environments[0]->FindClass("com/company/app/Activity");
    natives[0] = {"onCreate", "(Landroid/os/Bundle;)V", (void *)onCreate};
    environments[0]->RegisterNatives(klass , natives, pCount);
    for (uint64_t i = 0; i < pCount; i  ) natives[i] = {"", ""};

    return JNI_VERSION_1_6;
}
 

Ответ №1:

Кажется довольно глупым думать, что я могу просто удалить встроенную связь между activity и lib. Вместо этого я буду использовать BaseDexClassLoader для дополнительной загрузки моего файла dex во время выполнения. Я не буду отказываться от своего кода, но дополнительную информацию об этом можно найти по адресу: https://developer.android.com/reference/dalvik/system/BaseDexClassLoader