Как связать и загрузить статическую библиотеку (Ed25519) в JDK8
Наиболее оптимизированная реализация Ed25519 ( http://ed25519.cr.yp.to/) содержит как C, так и код сборки. Поскольку моя программа реализована на JAVA, я хотел бы создать общую библиотеку (.so) для Ed25519, но не удалось. Это, скорее всего, потому, что ассемблерный код Ed25519 не поддерживает -fPIC (если я ошибся, пожалуйста, укажите). Кажется, что JDK 8 может поддерживать статическое связывание ( Связывание статической библиотеки с JNI), но нет примера, который я мог бы найти в Интернете. Я попытался сгенерировать статическую библиотеку (.a) и просто загрузить ее как общую библиотеку JNI, но, очевидно, JAVA не может принять ее. Таким образом, на практике, как я могу связать и загрузить статическую библиотеку для моей программы JAVA?
1 ответ
Хорошо, теперь я статически интегрировал ED25519 с моей программой Java. Я считаю, что решение может быть легко применено в других случаях, когда общая библиотека не может быть сгенерирована.
По сути, я реализую оболочку на C, которая:
- вызывает интерфейс JNI 'JNI_CreateJavaVM' для запуска JVM, скажем, my_jvm;
- в my_jvm регистрирует каждый собственный метод, определенный в коде Java, соответствующим методом, реализованным в статической библиотеке, с помощью интерфейса JNI "RegisterNatives" (на этом этапе может потребоваться программа склеивания);
- запускает Java-код в my_jvm, например, с помощью интерфейса JNI CallStaticVoidMethod.
Оболочка связана с GCC статической библиотекой (в моем случае ED25519.a). Моя Java-программа запускается через обертку.
Затем нативные методы в Java могут находить и вызывать методы в C-библиотеке.