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 规范呢?
谢谢各位
Answers
使用 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