Предположим, что нам нужно реализовать некоторый java-метод в собственном коде и выставить его пользователю. Мы знаем, что вся работа выполняется на родной стороне, т. Е. Единственная ответственность java-кода - передать предоставленные пользователем аргументы в собственный код и вернуть результат обратно. В соответствии с этим, ява слой может быть реализован двумя способами:Собственные методы Java. Public vs. private
При использовании нативных методов, которые непосредственно подвергаются пользователю:
public native Object doSmth(Object arg0, Object arg1);
С помощью тонкой общественной обертки вокруг частного нативного метода :
public Object doSmth(Object arg0, Object arg1) { return nativeDoSmth(arg0, arg1); } private native Object nativeDoSmth(Object arg0, Object arg1);
Я видел оба подхода в реальных проектах и даже как бывший и последний в том же проекте.
Итак, мой вопрос: имеет ли какой-либо из упомянутых альтернатив некоторые технические или эксплуатационные или ремонтные преимущества, которые должны поощрять использование только одного варианта. Или, может быть, это всего лишь вопрос вкуса?
«Открытый» метод является частью API объектов. Метод «native» - это решение для реализации. Детали реализации не должны быть видны публичному API. Вариант 2 скрывает реализацию от API. – Andreas
Вы найдете вариант 2, используемый исключительно в JDK, а не в варианте 1. Я думаю, что это хорошая идея, это дает вам еще одну степень свободы при разработке и поддержании вашего уровня JNI. – EJP
Ваш вопрос предполагает, что подписи совпадают. Это часто бывает не так, потому что естественным для API класса может быть много работы в коде JNI. Во многих случаях проще преобразовывать входы и выходы с использованием Java в типы данных, с которыми легче работать в JNI. –