【发布时间】:2014-04-04 09:11:23
【问题描述】:
我正在做一个需要从 dll 文件中调用一些方法的项目。 这两个dll是
- EasySign.dll
- EasySignJNI
EasySignJNI 依赖于 EasySign。
我编写了加载 EasySignJNI 的类,如下所示:
package easysign;
class EasySign {
EasySign(){}
public native String EasyHashFile(String filename);
public native int EasySign(String pkcs11_driver,String pin, int type, String file_data, int out_format, String signed_file, String cert_out, int cert_format);
public native int EasyVerify(String cert_user, String file_data, String signed_file, String crl_file, String ca_file, String out_document);
static {
System.loadLibrary("EasySignJNI");
}
}
现在我会像这样从我的主要方法中调用这些方法:
public class Test {
public static void main(String[] args) throws IOException{
EasySign es = new EasySign();
System.out.println("EasyHashFile : " + es.EasyHashFile("test.txt"));
}
}
我必须在 -Djava.library.path 中指定什么?只有我的 EasySignJNI.dll 所在的路径?这样可以调用native方法吗?
为了完整性,我使用 NetBeans。
编辑: 我注意到提供给我的第三方 dll(特别是 JNI dll)定义了没有任何包的方法名称,因此我不得不将加载 dll 的类放在默认包中。有没有办法只更改 dll 方法名称,包括我自己的包名称?
编辑 2: 我的意思是 EasySign.dll 和 EasySignJNI.dll 都是按原样提供给我的,我无法修改它们(我没有源代码)。 EasySignJNI 是 JNI 部分,但检查它我注意到方法符号的格式为:_java_EasySign_MethodName。当我从我的 Easysign 类加载 Java 中的 dll 时(这个类必须驻留在“mypackage”包中),我收到 jni unsatisfiedlinkerror 因为,如果我理解正确,我正在调用“_java_mypackage_EasySign_MethodName”方法,即标志是不同于dll的。那么让它工作的唯一方法是重写JNI部分并构建它以具有JNI方法的正确符号?
【问题讨论】:
标签: java dll methods java-native-interface