博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mac OS X中的JNI调用和实现
阅读量:6566 次
发布时间:2019-06-24

本文共 1725 字,大约阅读时间需要 5 分钟。

hot3.png

在Mac OS X中,JNI的操作方法与网上给出的Linux中的使用方法略有小小差异。突然之间发现,在此记之。

网上给出的在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作为后缀名?立即更改文件名,果然能正常运行!

完整演示(假设库名是hello):

  • Linux系统中:

gcc -I $JAVA_HOME/include -I $JAVA_HOME/include/linux -fPIC -shared -o libhello.so hello.c

  • Mac OS X中:

gcc -I $JAVA_HOME/include -I $JAVA_HOME/include/darwin -fPIC -shared -o libhello.jnilib hello.c

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

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

补充:

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

ps: 

1,mac os 下, 

java.libary.path:/Users/may/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.

注意最后的 . 表示包括执行java 程序的当前目录,所以 把jnilib文件放在执行类的同一个父目录里也可以(父目录不包括包目录

2,gcc 参考 :

gcc 中, -f 也许是 feature 的意思吧, PIC 标识 Position-Independent-Code , 产生位置无关代码,这正式共享库需要的;-shared 标识产生共享代码,一般默认包含 PIC特性。

3,动态库可以放进jar包, 但是只能作为资源文件打进去, 使用的时候需要先把动态库文件读出来放进系统的临时目录,然后才可以load供jvm使用。

转载于:https://my.oschina.net/u/255456/blog/370066

你可能感兴趣的文章
SpringBoot(十五)_springboot实现预览pdf
查看>>
Intellij IDEA 2018.2 搭建Spring Boot 应用
查看>>
杨老师课堂之JavaScript定时器限时抢购秒杀商品案例
查看>>
作为数据科学家,我都有哪些弱点
查看>>
(转)线程安全的CopyOnWriteArrayList介绍
查看>>
云企业网的应用于功能详解
查看>>
中交兴路完成7亿元A轮融资,携手蚂蚁金服共建小微物流科技服务生态
查看>>
对LinqtoExcel的扩展 【数据有限性,逻辑有效性】
查看>>
WPF TreeView HierarchicalDataTemplate
查看>>
32岁老程序员的现状和尴尬,无奈中透露些许悲凉,有选择却更痛苦
查看>>
找电影的步骤
查看>>
一键清理 Nexus 中无用的 Docker 镜像
查看>>
unity3d-高频率面试题目
查看>>
Nancy之结合TinyFox调试备忘
查看>>
WPF MeshGeometry3D
查看>>
puppet cron 模块
查看>>
7nm处理器的优点和缺点
查看>>
Tor介绍
查看>>
pring-boot集成Springfox-Swagger2
查看>>
c#调用C++DLL类型转换
查看>>