完整的原生实现

Full Native Implementation

我正在通过 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 **) &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;
}

认为我可以简单地删除 activity 和 lib 之间的本地链接似乎很愚蠢。相反,我将利用 BaseDexClassLoader 在运行时旁加载我的 dex 文件。我不会放弃我的代码,但可以在以下位置找到有关此的更多信息:https://developer.android.com/reference/dalvik/system/BaseDexClassLoader