А також:
- Java Native Interface - взаємодія Java c нативним кодом.
- Створення Dll-бібліотеки, що використовує AIMP Remote API.
- Створення модуля для OwnLang.
- Взаємодія з VK API.
Генерування заголовки для Сі
Для взаємодії Java з Сі, потрібно визначитися з сигнатурою нативних методів і розташуванням класів. Припустимо, що клас для взаємодії з Dll-бібліотекою матиме ім'я AIMP, перебувати в пакеті aimpremote і мати метод currentTrack, який повертає масив. Напишемо такий клас.
public final class AIMP # 123;
public static native String # 91; # 93; currentTrack # 40; # 41; ;
скомпілюємо AIMP.java
javac aimpremote \ AIMP.java
І скористаємося утилітою для створення заголовків файлів javah
javah aimpremote.AIMP
В результаті отримаємо файл aimpremote_AIMP.h з таким вмістом:
/ * DO NOT EDIT THIS FILE - it is machine generated * /
Написання Dll-бібліотеки
Створимо новий проект Win32 з ім'ям LibAIMPRemote.
Додамо заголовки: згенерований aimpremote_AIMP.h і apiRemote.h з AIMP SDK (скачати можна з офіційного сайту).
Залишилося в настройках проекту створити конфігурацію для компіляції 64-бітової версії бібліотеки і підключити заголовки з JDK.
Тепер реалізуємо функцію currentTrack. Створимо масив з трьох елементів (виконавець, назва, альбом) і заповнимо його даними з MemoryMappedFile.
#define WRITE_TO_STRING_ARRAY (i, x) \
memcpy (charBuffer, pBuff, (x) * 2); \
env-> SetObjectArrayElement (info, (i), env-> NewString (charBuffer, (x)));
JNIEXPORT jobjectArray JNICALL Java_aimpremote_AIMP_currentTrack
# 40; JNIEnv * env, jclass jobj # 41; # 123;
HANDLE hAIMP = OpenFileMapping # 40; FILE_MAP_READ, false. AIMPRemoteAccessClass # 41; ;
if # 40 ;. hAIMP # 41; # 123;
jobjectArray info = env -> NewObjectArray # 40; 3. env -> FindClass # 40; "Java / lang / String" # 41 ;. 0 # 41; ;
PAIMPRemoteFileInfo aimpFileInfo = # 40; PAIMPRemoteFileInfo # 41;
MapViewOfFile # 40; hAIMP, FILE_MAP_READ, 0. 0. AIMPRemoteAccessMapFileSize # 41; ;
if # 40; aimpFileInfo # 41; # 123;
LPWSTR pBuff = # 40; LPWSTR # 41; # 40; # 40; PBYTE # 41; aimpFileInfo + sizeof # 40; TAIMPRemoteFileInfo # 41; # 41; ;
jchar charBuffer # 91; 256 # 93; ;
WRITE_TO_STRING_ARRAY # 40; 2. aimpFileInfo -> AlbumLength # 41; ;
WRITE_TO_STRING_ARRAY # 40; 0. aimpFileInfo -> ArtistLength # 41; ;
pBuff + = aimpFileInfo -> DateLength
+ aimpFileInfo -> FileNameLength
+ aimpFileInfo -> GenreLength;
WRITE_TO_STRING_ARRAY # 40; 1. aimpFileInfo -> TitleLength # 41; ;