Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

Реализация native методов

#java #cpp #winapi #jni


Нужно с помощью JNI из Java реализовать работу с фунциями Win32 API:
VirtualAlloc, VirtualFree, VirtualLock, VirtualUnlock. Создал .h файл с помощью javah,
но не знаю как реализовать эти методы. Нигде не могу найти пример.
    


Ответы

Ответ 1



Создай java класс например WinWork. И в нём объяви нужные функции(Например VirtualAlloc, VirtualFree) и напиши загрузку либы: package my.pack; public class WinWork { static { System.loadLibrary("libname"); } native public static void virtualAlloc(); native public static void virtualFree(); } теперь при вызове WinWork.virtualAlloc() JVM будет искать в либах метод Java_my_pack_WinWork_virtualAlloc(...) Далее нужно объявить JNI функций в C++. Нам надо создать хедеры с объявлениями функций C++, которые мы хотим вызывать. Можно написать их вручную или заюзать: javac -d bin/ src/my/pack/WinWork.java cd bin javah my.pack.WinWork Появится примерно такой хейдер(или можно написать его вручную): #include JNIEXPORT void JNICALL Java_my_pack_WinWork_virtualAlloc(JNIEnv *, jclass); JNIEnv — это интерфейс к виртуальной машине. Все операции с JVM выполняются с помощью него. jclass — это идентификатор java класса, у которого есть метод native, отождествленный с этой функцией, то есть в нашем случае это WinWork. Но jclass в качестве второго параметра передается тогда, когда метод объявлен как static. Если бы он был обычным методом, то нам бы передавался jobject, который бы идентифицировал объект, метод которого мы вызвали (фактически это аналог this). Остается только реализовать эти функции.

Комментариев нет:

Отправить комментарий