Дизайн приложения при использовании NDK (JNI) - PullRequest
0 голосов
/ 22 мая 2018

Как всем известно, мы используем NDK (или JNI) для вызова нативного кода из кода Java.

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

Однако, когда я проверяю некоторые проекты с открытым исходным кодом, большинствоони помещают всю свою бизнес-логику в слой JNI.Это хороший дизайн?

Напротив, следует ли нам сделать слой JNI простым слоем-оберткой и поместить бизнес-логику на уровень нативного кода (например, разделяемую библиотеку для вызова на уровне JNI)?

Подводя итог: существует два различных варианта:

1) Java-код -> JNI-код (здесь есть бизнес-логика)

2) Java-код ->Код JNI (слой-обертка) -> нативный код (разделяемая библиотека, здесь есть бизнес-логика)

Какой из них хороший дизайн?

Мне было интересно, что такое хороший дизайн при использованииJNI или Android NDK?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Я не думаю, что это правильно - код JNI и собственный код .То, что вы называете «кодом JNI», - это тот же нативный код, что и любой другой, оно просто использует методы и классы, определенные в библиотеке JNI.Ведь сама среда выполнения Android написана на C / C ++, поэтому JNI - это просто интерфейс к ней.

Теперь к вашему вопросу.

Из соображений производительности обычно лучше отделить вашу логику от JNI, потому что это влечет за собой дополнительные накладные расходы.Например, более эффективно использовать const char *, а не jstring, если ваша строка не должна пересекать собственную / управляемую границу.Как правило, не используйте типы JNI для переменных, которые не пересекают границу.

С точки зрения design обычно также лучше определять интерфейс отдельно от логики, поскольку он позволяетлегко изменить один, не меняя другой.Тот же принцип, что и при использовании в Java, рекомендуется использовать interface, а не class.Но кроме того, на карту поставлена ​​переносимость вашего кода.

Единственный случай, когда я вижу, где было бы разумно поместить весь код в файлы, использующие JNI, - это очень маленькие нативные компоненты, которые не работают.действительно не включает в себя какую-либо сложную логику.Как простая встроенная функция проверки номера лицензии или пароля.

0 голосов
/ 23 мая 2018

для безопасности key магию ключа следует поместить в слой NDK.

...