Трансляція програється в aimp музики в статус вконтакте

А також:
- 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.

Трансляція програється в aimp музики в статус вконтакте

Трансляція програється в aimp музики в статус вконтакте

Додамо заголовки: згенерований aimpremote_AIMP.h і apiRemote.h з AIMP SDK (скачати можна з офіційного сайту).
Трансляція програється в aimp музики в статус вконтакте

Залишилося в настройках проекту створити конфігурацію для компіляції 64-бітової версії бібліотеки і підключити заголовки з JDK.
Трансляція програється в aimp музики в статус вконтакте
Трансляція програється в aimp музики в статус вконтакте

Тепер реалізуємо функцію 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; ;