Я пишу плагин в 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);