C ++ / Java в Android, dumpReferenceTables для logcat - PullRequest
0 голосов
/ 05 сентября 2018

Я успешно создал Java-приложение, которое выгружает локальные и глобальные JNI-файлы в logcat, проблема в том, что это работает только для текущего запущенного процесса. Этот код был

        Class cls = Class.forName("android.os.Debug");
        Method method = cls.getDeclaredMethod("dumpReferenceTables");
        Constructor con = cls.getDeclaredConstructor();
        con.setAccessible(true);
        method.invoke(con.newInstance());

Наше приложение на C #, есть ли способ вызвать это из Xamarin.Android или Forms?

Я также скомпилировал бинарный файл linux-gnueabi-g ++ из этого или аналогичного кода, но получаю ошибки времени выполнения с помощью env, GetEnv () и "неопределенной ссылки на` JNI_CreateJavaVM '".

jclass vm_class = env->FindClass("dalvik/system/VMDebug");
jmethodID dump_mid = env->GetStaticMethodID( vm_class, "dumpReferenceTables", "()V" );
env->CallStaticVoidMethod( vm_class, dump_mid )

У нас в основном есть рутированные устройства, поэтому использование c-бинарного является опцией, но я не уверен, является ли это правильным маршрутом вообще? Спасибо

1 Ответ

0 голосов
/ 05 сентября 2018

Реализация Android JNI не позволяет JNI_CreateJavaVM(), но даже если бы вы могли создать еще одну JVM ... какие ссылки вы бы выбросили? Здесь каждое приложение работает в отдельной JVM. Таким образом, запуск c-двоичного файла не поможет разобраться с работающими приложениями.

С правами суперпользователя вы можете внедрить свой код в любое (или все) работающее приложение. Возможно, самый простой способ - заменить системный зигот измененной версией.


Версия C # этого Java-кода, вероятно, будет использовать JNIEnv , как показано ниже здесь .

IntPtr cls = JNIEnv.FindClass("android.os.Debug");
IntPtr methodID = JNIEnv.GetStaticMethodID("dumpReferenceTables", "()V");
JNIEnv.CallStaticVoidMethod(cls, methodID);
...