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 规范呢?

谢谢各位

java jni C++

书中自有妻成群 10 years, 3 months ago

使用 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

雷雷A-C answered 10 years, 4 months ago

Your Answer