如何通过 JNI 使用本机代码创建 Java 库 (API)

How to create a Java Library (API) with native code via JNI

我的问题如下

我需要在 Java 中创建一个库。到目前为止,一切都很好。 像任何体面的 Java 库一样,它必须可以在任何 JVM 上使用。

但这里的困难在于这个库将包含大量本地代码

我对JNI有一些了解。 我尝试在 Android 应用程序中使用 Android StudioAndroid NDK.

在 Java 中创建一些 native 方法

太好了,我可以做很多 HelloWorld 示例。但是如何将其导出为库?

我的项目需要外部 C++ 库。 我想包装这些库并在包装在 Java 库中的 JNI 包装器中使用它们。

请参阅以下架构:

为了使事情更简单,以一个简单的 HelloWorld JNI API 为例。 创建一个 Java 桌面应用程序(或其他任何应用程序)。导入 Helloworld JNI API(作为 jar),调用 String HelloWorldJNI_API.sayHello(String yourName) 并打印结果。

这里需要什么:

  1. JNI API 显然会将 sayHello() 方法声明为 本机方法;
  2. 参数 (String yourName) 被发送到 JNI ;
  3. JNI 代码调用一个内部很棒的 C++ so 库来处理数据和 returns "hello" + "yourName"(很棒,对吧?)
  4. JNI代码returns结果为jstring
  5. 最后,JavaAPIreturns结果为String 瞧!

这个简单的示例应该向您展示我正在尝试做什么。

好吧,您的库将包含带有 java 包装器代码的 .jar 文件以及本机文件(.so,如果您基于 linux,或者 .dll,如果你在 windows).

乐趣从这里开始:

因为本机是用处理器汇编语言编译的,所以您必须为所有支持的目标编译 .so(例如,对于所有 android 具有本机支持的目标,因为永远如此): armv5、armv7、armv7s、arm64

现在,您必须提供包含上述所有内容的存档。

在这种情况下,您需要一个独立的库,而不向开发人员提供代码。

如果你能提供代码,那么你就不用担心不同的架构。