#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