Mac OS X中的JNI调用和实现

回眸只為那壹抹淺笑 提交于 2020-01-07 07:45:29

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

网上给出的在Windows和Linux操作系统下的JNI编程教程很多,其实无论在哪个系统中都是相似的步骤。总结如下:

  1. 编写Java程序文件,要使用调用本地库的类需在static初始化块内使用System.loadLibrary("库名")方法加载。
  2. 编译该Java类获得.class文件,并且使用javah -jni 类名获取“类名.h”头文件。
  3. 包含该头文件并实现头文件中声明的方法。
  4. 编译并生成本地库文件。
  5. 将该库文件放置于java.library.path路径(可以通过System.getProperties().get("java.library.path")查看该路径)下,即可正常使用该Java类。

唯一不同的处在于本地库文件的编译方式不同。

Windows中,一般使用VisualStudio IDE生成"库名.dll"动态链接库文件。(注意:库文件的命名方式及其重要!)

Linux中使用gcc进行编译。一般要使用-I选项包含$JAVA_HOME/include和$JAVA_HOME/include/linux,并使用-fPIC -shared -o lib库名.so生成动态链接库文件。

而在Mac OS X中,采用和Linux和有相似的做法。但是我尝试后发现,无论我将该库文件放置于何处,并且如何设置java.library.path都会产生java.lang.UnsatisfiedLinkError异常,说无法找到该库文件。网上也未找到答案。后来偶然在java.library.path路径之一的/usr/lib/java中发现里面有个libjdns_sd.jnilib文件。莫非这个动态库文件必须以jnilib作为后缀名?立即更改文件名,果然能正常运行!

结论:Mac OS X中,欲使用JNI调用本地库,该库文件名称必须是 lib库名.jnilib,而不是以.so为后缀名。

至于Windows和Linux中动态库文件名到底为何,本人未做测试。一般而言,应该可以在java.library.path中找到例证。


补充:

在用Eclipse开发时,如果java.library.path包含.(当前文件夹),则将对应本地库文件置于项目文件夹下(src和bin的父文件夹)。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!