Java-эквивалент C # делегата (особенно для использования в качестве аргумента нативного метода) - PullRequest
0 голосов
/ 03 октября 2018

Я пишу плагин в Java, который использует нативные методы.У меня есть существующий плагин, написанный на C #, который использует те же нативные методы, но теперь мне нужен этот плагин в Java.Версия плагина для C # объявляет тип делегата, который позже передается в качестве аргумента одному из собственных методов.

public delegate void LH_ERROR_CALLBACK_FN(IntPtr errorCallBackInst, LH_ERROR errorCode, string szMessage, string szDetail);

public void ErrorHandler(IntPtr errorCallBackInst, LH_ERROR errorCode, String szMessage, String szDetail) 
{
    Console.WriteLine("ERROR: " + szMessage);
    Console.WriteLine("Details: " + szDetail);
    Console.WriteLine("Error code: " + errorCode);
}

LH_ERROR_CALLBACK_FN ErrorCallBackHandler = ErrorHandler;

public static extern LH_ERROR lh_InitBase(LH_ERROR_CALLBACK_FN errorCallbackFn, ref LH_HEAP_INTERFACE pHeapInterface, IntPtr pHeapInst, ref LH_OBJECT pErrorCallbackInst, ref LH_COMPONENT phCBase);

"LH_ERROR_CALLBACK_FN" задается в качестве аргумента для метода "lh_InitBase" и вC #, который работает просто отлично.К сожалению, я не могу изменить параметры нативного метода (lh_InitBase) и поэтому должен найти способ сделать то же самое в Java.

В Java, я попытался сделать "LH_ERROR_CALLBACK_FN" как метод внутриинтерфейс, а затем передать интерфейс в качестве аргумента, но интерфейс не принят, и я получаю следующую ошибку:

java.lang.IllegalArgumentException: Unsupported argument type at parameter 0 of function lh_InitBase

Я также пытался следовать этому примеру здесь, используя объект Method из библиотеки java.lang.reflect, но в итоге я получаю то же сообщение об ошибке.

При поиске решения я обнаружил, что делегат не может быть создан вJava или, что лучше заменить его, это интерфейс.Сложность в том, что в Java некоторые вещи, такие как интерфейс, по-видимому, не принимаются в качестве параметра при использовании с нативным методом.

Если это какая-либо помощь, вот что такое нативный метод и «LH_ERROR_CALLBACK_FN»выглядит в заголовочном файле:

typedef void (*LH_ERROR_CALLBACK_FN)(void* errorCallBackInst, LH_ERROR errorCode, const char* szMessage, const char* szDetail);

LH_ERROR lh_InitBase(LH_ERROR_CALLBACK_FN errorCallbackFn, LH_HEAP_INTERFACE* pHeapInterface, void* pHeapInst, void* pErrorCallbackInst, LH_COMPONENT* phCBase);
...