1

Ed25519 ( http://ed25519.cr.yp.to/ )的最优化实现包含 C 和汇编代码。由于我的程序是用 JAVA 实现的,我想为 Ed25519 生成一个共享库 (.so) 但失败了。这很可能是因为 Ed25519 汇编代码不支持 -fPIC(如果我错了,请指出)。JDK 8 似乎可以支持静态链接(Linking static library with JNI),但我在网上找不到示例。我试图生成一个静态库(.a)并简单地将其加载为 JNI 的共享库,但显然 JAVA 不能接受它。那么在实践中,如何将静态库链接并加载到我的 JAVA 程序中呢?

4

1 回答 1

1

好的,现在我已经将 ED25519 与我的 Java 程序静态集成。我相信该解决方案可以轻松应用于无法生成共享库的其他情况。

基本上,我在 C 中实现了一个包装器,它:

  1. 调用 JNI 接口“JNI_CreateJavaVM”来启动 JVM,例如 my_jvm;
  2. 在my_jvm中,通过JNI接口'RegisterNatives'将java代码中定义的每个native方法注册到静态库中实现的对应方法中(这一步可能需要一个glue程序);
  3. 在 my_jvm 中启动 java 代码,例如,通过 JNI 接口“CallStaticVoidMethod”。

包装器通过 GCC 与静态库(在我的情况下为 ED25519.a)链接。我的 java 程序是通过包装器启动的。

然后,Java 中的本地方法可以定位和调用 C 库中的方法。

于 2015-03-21T18:18:32.703 回答