最近有个任务,我需要调用某个用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 规范呢?
谢谢各位
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
它就给个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)