java 通过 jni 调用 dll 和 so 的方式?
最近有个任务,我需要调用某个用CPP
写的加密算法(不懂CPP
),dll 和 so 由公司其它部门提供(没有文档.zip)我选择了 jni 方式调用,自己做了个demo
现在有几个疑问:
1. dll 或 so 必须是专门为 jni 方式编写吗?假设1: 我写的java 代码的包名和文件名(类名)和方法必须对应的。但是这些信息通过 dll和so 得不到。
2.我在 linux 上,通过
strings xxx.so > test
用 vim 打开后搜索 java 没有找到字符串,是不是意味着这个 so 不符合规范,同样的方式查看我自己 demo 中的 so 文件,我可以从 test 文件中得到一组字符串
Java_sf_gg_Hello_add
Java 代表通过 java 调用
sf_gg 代表 java 类的包名 package sf.gg
Hello_add 代表 Hello类中的 add 方法
假设2,没有从 xxx.so 中得到上面的信息是否代表这个 xxx.so 不符合 jni 规范呢?
谢谢各位
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
使用 JNI,需要按特定的接口规范来写一个 C/C++ 程序,生成 DLL,然后再通过 JNI 来调用这个中间 DLL,通过这个 DLL 去调用其它未实现 JNI 接口的 DLL,相关文档可以参考 Java Native Interface Specification
不过我个人觉得写 JNI 比较麻烦,还要用 C 去写中间件。
你可以考虑一下使用 JNA,它会通过 Java 做一个到 C DLL 的映射,只需要写纯 Java 代码就可以实现调用 C DLL 具体可以先看看 Getting Start with JNA
JNA 项目已经搬到了 Github:https://github.com/twall/jna
它就给个so或者dll文件么?没有说明jni方法么?
1.jni调用Cpp有约定的,具体怎么约定我不知道了,只知道流程:
首要在java中要用native关键字描述方法,然后要用javah命令根据java类得到cpp中用到的头文件,最后才是cpp引用那个头文件实现方法,然后才是java中load dll或者so文件,采用条用native方法
2.要是他给你dll,你肯定用不了,即使能用也有各种包名类型方法约定(上面说的那个定义)
Java调用CPP的so dll必须符合相关规定,如果不符合,人家只给你一个通用的linux so或者windows dll,那么再有头文件的情况下你可以自己把他封装为一个jni 的so或者dll,即:
javacode -> 自己的封装的JNI dll(so) -> 别人提供的标准非JNIso(dll)