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

时间:2015-08-28 12:28:35

标签: java android c++ api java-native-interface

我的问题如下。

我需要用Java创建一个库。到现在为止还挺好。 像任何体面的Java库一样,它必须可以在任何JVM上使用。

但是这里的难点在于这个库将包含很多原生代码

我对JNI有一些了解。 我尝试使用nativeAndroid Studio在Android应用中使用Java创建一些Android NDK方法。

非常棒,我可以做很多HelloWorld示例。但是如何将其导出为库?

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

请参阅以下架构: Java JNI API Schema

为了使事情更简单,请以一个简单的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 ++库,它可以处理数据并返回一个" hello" +" yourName" (真棒,对吗?)
  4. JNI代码将结果返回为jstring
  5. 最后,Java API将结果作为String返回 瞧!
  6. 这个简单的例子应该告诉你我想要做什么。

1 个答案:

答案 0 :(得分:2)

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

这是有趣的开始:

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

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

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

如果您可以提供代码,那么您无需担心不同的架构。