如何通过 JNI 使用本机代码创建 Java 库 (API)
How to create a Java Library (API) with native code via JNI
我的问题如下
我需要在 Java 中创建一个库。到目前为止,一切都很好。
像任何体面的 Java 库一样,它必须可以在任何 JVM 上使用。
但这里的困难在于这个库将包含大量本地代码。
我对JNI
有一些了解。
我尝试在 Android 应用程序中使用 Android Studio
和 Android NDK
.
在 Java 中创建一些 native
方法
太好了,我可以做很多 HelloWorld 示例。但是如何将其导出为库?
我的项目需要外部 C++ 库。
我想包装这些库并在包装在 Java 库中的 JNI 包装器中使用它们。
请参阅以下架构:
为了使事情更简单,以一个简单的 HelloWorld JNI API 为例。
创建一个 Java 桌面应用程序(或其他任何应用程序)。导入 Helloworld JNI API(作为 jar),调用 String HelloWorldJNI_API.sayHello(String yourName)
并打印结果。
这里需要什么:
- JNI API 显然会将 sayHello() 方法声明为
本机方法;
- 参数 (
String yourName
) 被发送到 JNI ;
- JNI 代码调用一个内部很棒的 C++ so 库来处理数据和 returns "hello" + "yourName"(很棒,对吧?)
- JNI代码returns结果为
jstring
- 最后,JavaAPIreturns结果为
String
瞧!
这个简单的示例应该向您展示我正在尝试做什么。
好吧,您的库将包含带有 java 包装器代码的 .jar 文件以及本机文件(.so,如果您基于 linux,或者 .dll,如果你在 windows).
乐趣从这里开始:
因为本机是用处理器汇编语言编译的,所以您必须为所有支持的目标编译 .so(例如,对于所有 android 具有本机支持的目标,因为永远如此):
armv5、armv7、armv7s、arm64
现在,您必须提供包含上述所有内容的存档。
在这种情况下,您需要一个独立的库,而不向开发人员提供代码。
如果你能提供代码,那么你就不用担心不同的架构。
我的问题如下
我需要在 Java 中创建一个库。到目前为止,一切都很好。 像任何体面的 Java 库一样,它必须可以在任何 JVM 上使用。
但这里的困难在于这个库将包含大量本地代码。
我对JNI
有一些了解。
我尝试在 Android 应用程序中使用 Android Studio
和 Android NDK
.
native
方法
太好了,我可以做很多 HelloWorld 示例。但是如何将其导出为库?
我的项目需要外部 C++ 库。 我想包装这些库并在包装在 Java 库中的 JNI 包装器中使用它们。
请参阅以下架构:
为了使事情更简单,以一个简单的 HelloWorld JNI API 为例。
创建一个 Java 桌面应用程序(或其他任何应用程序)。导入 Helloworld JNI API(作为 jar),调用 String HelloWorldJNI_API.sayHello(String yourName)
并打印结果。
这里需要什么:
- JNI API 显然会将 sayHello() 方法声明为 本机方法;
- 参数 (
String yourName
) 被发送到 JNI ; - JNI 代码调用一个内部很棒的 C++ so 库来处理数据和 returns "hello" + "yourName"(很棒,对吧?)
- JNI代码returns结果为
jstring
- 最后,JavaAPIreturns结果为
String
瞧!
这个简单的示例应该向您展示我正在尝试做什么。
好吧,您的库将包含带有 java 包装器代码的 .jar 文件以及本机文件(.so,如果您基于 linux,或者 .dll,如果你在 windows).
乐趣从这里开始:
因为本机是用处理器汇编语言编译的,所以您必须为所有支持的目标编译 .so(例如,对于所有 android 具有本机支持的目标,因为永远如此): armv5、armv7、armv7s、arm64
现在,您必须提供包含上述所有内容的存档。
在这种情况下,您需要一个独立的库,而不向开发人员提供代码。
如果你能提供代码,那么你就不用担心不同的架构。