В моем проекте я хочу использовать JNI-агент для перехвата результатов методов java-static-native.
Мой базовый подход заключается в том, чтобы связать все статические методы с моим методом-перехватчиком. Метод перехватчика принимает переменное число аргументов и при вызове перенаправляет их в соответствующую статическую функцию.
Это подходящий подход? Прямо сейчас в моей реализации я изо всех сил пытаюсь передать переменные аргументы от функции-перехватчика фактической функции …
У кого-нибудь есть идея лучшего подхода к этому? Или я делаю что-то слишком сложным образом?
va_arg
не собирается давать вам информацию о типе параметров. В лучшем случае вы получите количество параметров, и если все ваши функции имеют различное количество параметров (за исключением JNIEnv*
а также jclass
) тогда вы сможете заставить его работать.
Если вы перехватываете определенные методы, вы можете создать таблицу методов перехвата. Просто используйте JavaH для генерации заглушек, используйте переименования, если хотите, и затем создайте свою таблицу JNINativeMethod.
static JNINativeMethod JVM_Methods[] =
{
// grab function names and signatures from JavaH stubs
{"OnDeepLink", "(Ljava/lang/String;)V", (void*)& JNI_OnDeepLink},
...
};
int JVM_Methods_Count = N;
// register your overrides
jint nRes = g_env->RegisterNatives(activity, JVM_Methods, JVM_Methods_Count);
Кроме того, у меня есть небольшая хитрость, когда после регистрации функций C я перезвоню в занятие / класс и установлю логическое значение, с которым они связаны. Я динамически соединяюсь, поэтому мне нужно проверить, установлены ли они перед выполнением вызова.
Других решений пока нет …