Я пытаюсь понять взаимодействие между Java и JNI, поэтому я решил проследить один из API Java, public int write (byte[] audioData, int offsetInBytes, int sizeInBytes)
(https://android.googlesource.com/platform/frameworks/base/+/android-6.0.1_r1/media/java/android/media/AudioTrack.java#1699).
Если кто-то укажет, если мой мыслительный процессявляется правильным или нет.
Метод
public int write (byte[] audioData, int offsetInBytes, int sizeInBytes)
содержит
return write(audioData, offsetInBytes, sizeInBytes, WRITE_BLOCKING);
, поэтому его можно проследить до
public int write(@NonNull byte[] audioData, int offsetInBytes, int sizeInBytes, @WriteMode int writeMode)
(https://android.googlesource.com/platform/frameworks/base/+/android-6.0.1_r1/media/java/android/media/AudioTrack.java#1739).
Внутри этой функции есть
int ret = native_write_byte(audioData, offsetInBytes, sizeInBytes, mAudioFormat, writeMode == WRITE_BLOCKING);
, который вызывает собственный метод
private native final int native_write_byte(byte[] audioData,i nt offsetInBytes, int sizeInBytes, int format, boolean isBlocking);
После того, как я проверил все AOSP, яобнаружил, что единственное место, содержащее native_write_byte
, находится в статическом JNINativeMethod gMethods []
`"native_write_byte", "([BIIIZ)I",
(void*)android_media_AudioTrack_writeArray<jbyteArray>`
(`https://android.googlesource.com/platform/frameworks/base/+/android-
6.0.1_r1/core/jni/android_media_AudioTrack.cpp#1065`)
(`https://android.googlesource.com/platform/frameworks/base/+/android-
6.0.1_r1/core/jni/android_media_AudioTrack.cpp#592`)
Теперь я хочу выяснить, в каких общих объектах есть нативная функция, поэтому я скачал все файлы в / system/ bin и grep через них, и нашел только один, который libandroid_runtime.so
.
После открытия общего объекта в Ida pro, я нашел его, ища уникальную строку.
Итак, яЯ думаю, что когда разработчики используют функцию записи, они импортируют libandroid_runtime.so и используютнаписать функцию, которая содержит native_write_byte
функцию, которая является нативной функцией, которая вызывает static jint android_media_AudioTrack_writeArray
.
Является ли это правильным способом отследить до C ++?