(澳门博彩导航) java 通过 jni 调用 dll 和 so 的方式?
澳门博彩导航网址
澳门博彩导航网址
当前位置 : 澳门博彩导航网址 > 澳门博彩导航

(澳门博彩导航) 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 规范呢?

谢谢各位

使用 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 dllso -> 别人提供的标准非JNIsodll

栏目列表

广告位

澳门博彩导航网址