У меня довольно сложный проект для перехода с C ++ (Linux) на Java
В настоящее время версия C ++ распространяется в виде общей библиотеки (.so), за которой следует класс заголовка интерфейса верхнего уровня. Детали реализации полностью скрыты от конечного пользователя.
Этот вопрос не о портировании кода C ++ на Java, а о создании аналогичного дистрибутива.
Давайте предположим, что у меня есть очень простой «публичный» класс в C ++, topapi.h
:
class TopApi
{
public:
void do( const string& v );
}
Фактическая реализация скрыта от пользователя API. Фактический проект может содержать еще 100 файлов / классов, которые вызовет do ().
Дистрибутив будет содержать 2 файла: topapi.so и topapi.h
Пользователи будут #include "topapi.h"
в своем коде, и связать свои приложения с topapi.so
,
Вопросы:
1. Как я могу добиться подобного эффекта в Java (скрыть код, связанный с IP)
2. Как я показываю публичные методы пользователю (не связанные с защитой кода, только Java-версия файла заголовка выше)
Проверять, выписываться ProGuard. Это, по крайней мере, запутывает файл jar, который в основном читается человеком. Это не совсем безопасно от реверс-инжиниринга, но я полагаю, что это не так.
Я не специалист по Java, но это то, что мы сделали для защиты реализаций в прошлом.
Я не знаю точно, что является движущей силой для порта Java, но если это просто для поддержки конечного пользователя Java, вы можете рассмотреть JNI-оболочку. Я предполагаю, что это, вероятно, не тот случай, но я думал, что упомяну это.
Что касается предоставления кода интерфейса пользователю, вы можете написать интерфейсный класс Java (например, чистый виртуальный абстрактный класс C ++) и просто не защищать этот класс.
Чтобы ответить на вопрос, как показать публичные методы для пользователя. Обычно это делается посредством комбинации объявления внутренних классов без модификатора доступа, что делает их доступными только из одного пакета, а не их документирования. Хотя не зависит от первого, его легко обойти, но он отправляет пользователю сообщение о том, что эти классы являются внутренними.
Java 9 добавляет модули, которые позволяют вам инкапсулировать целые пакеты, но этого еще нет, и вы все равно сможете обойти инкапсуляцию.
Одним из побочных эффектов преждевременной компиляции (как правило, в случае с C ++) является то, что распределенный код уже оптимизирован и не содержит метаданных, поэтому его труднее подвергнуть обратному инжинирингу. Java распространяется на промежуточном языке, но фактический машинный код генерируется во время выполнения (JIT-компиляция). Промежуточный язык практически не оптимизирован, поэтому его проще перепроектировать. Java также объединяет идею заголовочных файлов и исходных файлов, где .class
файл будет содержать все метаданные, необходимые для его использования.