Подробное введение в процесс регистрации функции Java JNI
Когда мы называем родной код в Java, он обычно реализуется через JNI. Нам нужно только загрузить локальный файл библиотеки. Что касается конкретной реализации нативного метода в Java, то все это передается на местный слой. Какова предпосылка для нас, чтобы правильно вызвать соответствующие функции в локальном коде в Java? Ответ состоит в том, чтобы установить соответствие один на один между нативными методами в Java и функциями в локальном коде с помощью определенных механизмов. Так что это за механизм? Это механизм регистрации функций JNI.
Существует два способа регистрации функций JNI, один из них является статическим методом регистрации, а другой - метод динамической регистрации. Давайте представим эти два метода реализации ниже.
1. Статическая регистрация.
1. Принцип реализации: установите соответствие один к одному между методом Java и функцией JNI на основе имени функции.
2. Процесс реализации:
① Написание кода Java;
② Скомпилируйте код Java и генерируйте файлы .class;
③ Используйте директиву Javah для генерации файла jni .h с помощью сгенерированного файла .class;
④ Сгенерированный файл заголовка JNI содержит объявление функций Java в слое JNI;
3. Недостатки:
① Написание очень неудобно, потому что имена функций слоя JNI должны следовать конкретному формату, а имена особенно длинные;
② Это приведет к большой работе для программистов, потому что файлы заголовков JNI должны быть записаны для всех классов Java, которые объявляют нативные функции;
③ Программа выполняет неэффективную, потому что при первом вызове собственной функции вам необходимо искать соответствующую локальную функцию в слое JNI в соответствии с именем функции, а затем установить соответствующие отношения. Этот процесс занимает много времени.
2. Динамическая регистрация.
1. Принцип реализации: напрямую сообщите нативной функции его указатель на соответствующую функцию в JNI;
2. Процесс реализации:
① Используйте структуру jninativemethod, чтобы сохранить соответствие между нативными функциями Java и функциями JNI;
② Сохранить соответствие между всеми нативными функциями и функциями JNI в массиве jninativemethod;
③ Начальник загрузки динамической библиотеки JNI через System.loadLibrary в Java, вызовите функцию JNI_ONLOAD и запустите динамическую регистрацию;
④ ④ androidruntime :: functionnativemethods будет вызвана в jni_onload для регистрации функций;
⑤ Последний звонок Jniregisternativemethods в Androidruntime :: RegisterNativeMethods Полная регистрация.
3. Преимущества: преодоление недостатков статической регистрации.
Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!