【发布时间】:2015-11-23 02:51:29
【问题描述】:
我的问题如下。
我需要用 Java 创建一个库。到目前为止,一切都很好。 像任何体面的 Java 库一样,它必须可以在任何 JVM 上使用。
但是这里的困难在于这个库会包含很多原生代码。
我对@987654324@ 有一些了解。
我尝试在带有Android Studio 和Android NDK 的Android 应用程序中用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 库,该库处理数据并返回“hello”+“yourName”(太棒了,对吗?)
- JNI 代码将结果作为
jstring返回 - 最后,Java API 返回结果为
String瞧!
这个简单的例子应该告诉你我想要做什么。
【问题讨论】:
-
您在哪方面需要帮助?谷歌展示了很多例子; Oracles Java 教程包括一步一步的精细操作。
-
我确实找到了一些很好的教程(主要针对 Android Studio 和 Netbeans),但它们是特定于平台的,这很有意义,但也限制了我。我需要与尽可能多的平台兼容。像 POJO '^^
-
JNI 库的 Java 部分在每个平台上都是相同的,但本机代码部分必须为您支持的每个平台单独编译。如果您查看“loadLibrary()”方法的工作原理,您会发现您只提供了库名称的根,Java 会计算出每个平台上的文件名。
-
JNA 抽象原生位,以便您可以专注于编写仅 Java 代码。在大多数平台上,jar 文件 JNA 配置文件 (
jna.jar) 知道如何从 jar 文件本身解压和加载本机库。
标签: java android c++ api java-native-interface