Android отслеживание Java API обратно в jni - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь понять взаимодействие между 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 ++?

1 Ответ

0 голосов
/ 21 ноября 2018

Вы сделали большую часть работы правильно.

Я не знаю, почему вы остановились на android-6.0.1_r1 , тот же файл CPP доступен в мастер .Этот собственный метод реализован как шаблонная специализация функции C ++:

template <typename T>
static jint android_media_AudioTrack_writeArray(JNIEnv *env, jobject thiz,
                                            T javaAudioData,
                                            jint offsetInSamples, jint sizeInSamples,
                                            jint javaAudioFormat,
                                            jboolean isWriteBlocking) {

Вы можете изучить, как работает эта функция.Обратите внимание, что здесь, как обычно для кода платформы Android, вызовы JNI заключаются в nativehelper заголовки.

, чтобы найти, в каких общих объектах содержится нативная функция, youможет найти соответствующий скрипт Android.bp .

cc_library_shared {
    name: "libandroid_runtime",
...
srcs: [
...
   "android_media_AudioTrack.cpp",

grep через / system / bin не требуется и может фактически вводить в заблуждение, особенно еслибиблиотеки были построены с включенной обфускацией.

Так что я думаю, что когда разработчики используют функцию записи, они импортируют libandroid_runtime.so и используют функцию записи, которая содержит функцию native_write_byte, которая является нативной функциейэто вызывает static jint android_media_AudioTrack_writeArray.

В основном правильно.В Java мы обычно вызываем динамическую библиотеку System.loadLibrary(name) to import libname, и мы бы сказали, что «native_write_byte реализован с static jint android_media_AudioTrack_writeArray<jbytearray>()» вместо того, чтобы говорить о Звоните из native_write_byte.

Время выполнения Android немного отличается. запускается при загрузке системы и используется всеми приложениями.Этот запуск вызывает , среди прочего, register_android_media_AudioTrack (JNIEnv *) , и он регистрирует все собственные методы, перечисленные в таблице gMethods , которая принадлежит android_media_AudioTrack.cpp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...