完全本机实现



为了防止第三方编辑,我正在通过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;
}

认为我可以简单地删除活动和lib之间的本地链接似乎相当愚蠢。相反,我将利用BaseDexClassLoader在运行时加载我的索引文件。我不会放弃我的代码,但是关于这方面的更多信息可以在:https://developer.android.com/reference/dalvik/system/BaseDexClassLoader

最新更新